加入外键的int []列并选择为json

时间:2018-04-13 18:40:49

标签: sql json postgresql

我想加入两张桌子。这就是我希望输出看起来像。

{'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     

我无法弄清楚如何进行此查询。

1 个答案:

答案 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;

在线示例:http://rextester.com/JNV28258