我想加入两张桌子。这就是我希望输出看起来像。
{'id': 1,
'description': None,
'name': 'admin',
'scope_id': [{'id': 1, 'name': 'default', 'color': 'primary'},
{'id': 2, 'name': 'admin', 'color': 'secondary'}]
以下是表格:
组
id | name | description | scope_id
---- | ------ | ------------- | ---------
1 | admin | None | [1,2]
范围
id | name | color
---- | -------- | --------
1 | default | Primary
2 | admin | Secondary
我无法弄清楚如何进行此查询。
答案 0 :(得分:1)
要加入这两个表:您可以执行以下操作:
选择g。,s。 来自“group”g 在s.id = any(g.scope_id);
上连接范围生成JSON的一种方法是:
select to_jsonb(g) - 'scope_id' ||
jsonb_build_object('scope_id', (select jsonb_agg(to_jsonb(s))
from scope s
where s.id = any(g.scope_id))
)
from "group" g;
to_jsonb(g) - 'scope_id'
将整行转换为JSON,然后删除scope_id
键。然后将相应scope
行的聚合附加到该JSON。
写上述内容的另一种方法是:
select to_jsonb(g) - 'scope_id' || jsonb_build_object('scope_id', s)
from "group" g
left join lateral (
select json_agg(row_to_json(s)) as scope_id
from scope s
where s.id = any(g.scope_id)
) s on true
或者,如果id
是"Group"
表的主键,则可以执行以下操作:
select row_to_json(t)
from (
select g.id, g.name, g.description,
json_agg(row_to_json(s)) as scope_id
from "group" g
join scope s on s.id = any(g.scope_id)
group by g.id
) t;