【问题标题】:Merge results from multiple joins into single row using postgresql使用 postgresql 将多个连接的结果合并到单行中
【发布时间】:2018-07-08 02:15:52
【问题描述】:

我正在尝试使用连接查询来构造单行结果,将连接表中的行包装到 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] | 

我希望结果看起来像这样; (这只是从表中取出 lang)

| id | sub1  | sub2 | 
|----|-------|------| 
| 1  | [1,2] | [1]  |

我这里有一个 sql fiddle:

http://sqlfiddle.com/#!17/60c3f/2

我研究过使用 UNION 查询,但它返回了多行和重复数据。我希望我能够以与我在上面尝试过的方式类似的方式做到这一点,但我不确定如何/是否可能?

【问题讨论】:

  • 你看起来像这样吗:array_agg(distinct sub2.lang)?
  • @Albert 是的,我认为你是对的! (我是 SQL 新手,所以我错过了这么简单的事情是有道理的!)。谢谢! (如果你想提交答案,我可以标记为正确)
  • 不相关,但是:array_to_json(array_agg(sub1.lang))可以简化为json_agg(sub1.lang)
  • @a_horse_with_no_name 好的-谢谢你的提示!

标签: sql postgresql


【解决方案1】:

您可以在array_agg 中使用distinct 关键字来删除重复项:

array_to_json(array_agg(distinct sub2.lang))

正如@a_horse_with_no_name 建议的那样,它可以简化为:

json_agg(distinct sub1.lang)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 2019-04-28
    • 2017-12-22
    • 2018-02-18
    相关资源
    最近更新 更多