sql - 如何从具有一对多关系的表中构建 JSON 行
问题描述
我有一张main
这样的桌子:
create foreign table main (
"id" character varying not null,
"a" character varying not null,
"b" character varying not null
)
我还有另一张桌子not_main
,像这样:
create foreign table not_main (
"id" character varying not null,
"fk" character varying not null,
"d" character varying not null,
"e" character varying not null
)
我是否想要一个返回如下的查询:
json
0 {"id": "id_main_0", "a": "a0", "b": "b0", "cs": [{"id": "id_not_main_0", "fk": "id_main_0", "d": "d0", "e": "e0"}, {"id": "id_not_main_1", "fk": "id_main_0", "d": "d1", "e": "e1"}]}
1 {"id": "id_main_1", "a": "a1", "b": "b1", "cs": [{"id": "id_not_main_2", "fk": "id_main_1", "d": "d2", "e": "e3"}, {"id": "id_not_main_3", "fk": "id_main_1", "d": "d3", "e": "e3"}]}
我该怎么做?
我试过了:
select
json_build_object(
'id', m."id",
'a', m."a",
'b', m."b",
'cs', json_build_array(
json_build_object(
'd', nm."d",
'e', nm."e"
)
)
)
from main m
left join not_main nm on
nm."requisitionId" = m.id;
但它只返回一个元素cs
:
json
0 {"id": "id_main_0", "a": "a0", "b": "b0", "cs": [{"id": "id_not_main_0", "fk": "id_main_0", "d": "d0", "e": "e0"}]}
1 {"id": "id_main_1", "a": "a1", "b": "b1", "cs": [{"id": "id_not_main_2", "fk": "id_main_1", "d": "d2", "e": "e3"}]}
OBS:考虑和之间的约束main
和not_main
是正确建模的,例如,我实际上将两列都id
作为 PK 并且fk
引用.id
main
解决方案
你想要 json 数组聚合。基本上,您只需要更改json_build_array()
为json_agg()
, 并添加一个group by
子句:
select
json_build_object(
'id', m.id,
'a', m.a,
'b', m.b,
'cs', json_agg(
json_build_object(
'd', nm.d,
'e', nm.e
)
)
)
from main m
left join not_main nm on
nm.requisitionId = m.id
group by m.id, m.a, m.b
推荐阅读
- html - 为什么我的标签一直偏移我的按钮?
- python - Python:将两个数组作为函数参数传递。期待一个系列,但只返回最后一个值
- sql-server - 尝试为其他几个列的完整地址创建一个列,但在某些地址上遇到问题
- python - 在属于自定义角色的库下导入自定义模块的正确方法是什么
- java - 打开视频输出并从 android 启动文件
- reactjs - socket.on 听太多
- ruby-on-rails - 安装了黄瓜 gem,但现在不显示它存在
- node.js - Discord.js:谁能告诉我为什么这是错误的?
- android - 未收到“MESSAGE_DELIVERED”Firebase 事件
- css - iOS 上的 CSS 背景问题