使用postgresql将多个联接的结果合并到一行中

使用postgresql将多个联接的结果合并到一行中,sql,postgresql,Sql,Postgresql,我尝试使用连接查询构造一行结果,将连接表中的行包装到json数组中 下面是一个示例方案 CREATE TABLE main(id int); INSERT INTO main values(1); create TABLE sub1(id int, main_id int, lang int); insert into sub1 values (1, 1, 1); insert into sub1 values (1, 1, 2); create TABLE sub2(id int, mai

我尝试使用连接查询构造一行结果,将连接表中的行包装到json数组中

下面是一个示例方案

CREATE TABLE main(id int);
INSERT INTO main values(1);

create TABLE sub1(id int, main_id int, lang int);
insert into sub1 values (1, 1, 1);
insert into sub1 values (1, 1, 2);

create TABLE sub2(id int, main_id int, lang int);
insert into sub2 values(1, 1, 1);
我的问题是:

select main.id, 
       array_to_json(array_agg(sub1.lang)) as sub1, 
       array_to_json(array_agg(sub2.lang)) as sub2
from main
     inner join sub1 on main.id = sub1.main_id
     inner join sub2 on main.id = sub2.main_id
where main.id = 1
group by main.id
目前,这种情况再次出现

| id | sub1  | sub2  | 
|----|-------|-------| 
| 1  | [1,2] | [1,1] | 
我希望结果是这样的;(这只是从桌子上拿下朗格)

我这里有一个sql小提琴:


我曾研究过使用联合查询,但它返回了多行和重复数据。我希望我能够以类似于我在上面尝试过的方式来完成这项工作,但我不确定如何/是否可能?

您可以使用数组内的
distinct
关键字来删除重复项:

array_to_json(array_agg(distinct sub2.lang))
正如@a_horse_和_no_名称所示,它可以简化为:

json_agg(distinct sub1.lang)

你看起来像这样吗:
array\u agg(distinct sub2.lang)
?@Albert啊是的,我想你是对的!(我是SQL新手,所以我可能会错过一些如此简单的东西!)。谢谢(如果你想提交答案,我可以标记为正确)不相关,但是:
array\u to_json(array\u agg(sub1.lang))
可以简化为
json\u agg(sub1.lang)
@a_horse\u,没有名字啊好的-谢谢你的提示!
json_agg(distinct sub1.lang)