【问题标题】:Combine partially repeated lines in sql join在sql join中合并部分重复的行
【发布时间】:2016-02-29 14:36:12
【问题描述】:

我在 PostgreSQL 数据库中有一些位置表:

Table loc -- the places themselves
---------
| id |  name
|  1 | Park X
|  2 | City A
|  3 | City B

Table locdad -- the hierarchical relationship between places
------------
| id | dad | loc
|  1 |  2  |  1
|  1 |  3  |  1

这描述了一个覆盖城市 A 和城市 B 的国家公园“X”,即公园在分层方案中有两个“父亲”。

当我进行联合查询时,我得到了这个公园的两条线:

select l.id,l.name loc,l1.name dad
from loc l
join locdad ld on ld.loc = l.id
join loc l1 on l1.id = ld.dad
where l.id=1

| id |   loc  |   dad
|  1 | Park X | City A
|  1 | Park X | City B

我想把结果合并成:

| id |   loc  |      dad
|  1 | Park X | City A, City B

我该怎么做?

【问题讨论】:

    标签: sql postgresql hierarchy


    【解决方案1】:

    尝试像这样使用 array_agg 函数:

    select l.id,l.name loc,array_agg(l1.name) dad
    from loc l
    join locdad ld on ld.loc = l.id
    join loc l1 on l1.id = ld.dad
    where l.id=1
    GROUP BY l.id,l.name
    

    这取决于您的 postgres 版本,但要获取用逗号分隔的字符串 - 9.0+ 使用:

    select l.id,l.name loc,string_agg(l1.name, ', ') dad
    from loc l
    join locdad ld on ld.loc = l.id
    join loc l1 on l1.id = ld.dad
    where l.id=1
    GROUP BY l.id,l.name
    

    或者这个 8.4

    select l.id,l.name loc,array_to_string(array_agg(l1.name), ', ') dad
    from loc l
    join locdad ld on ld.loc = l.id
    join loc l1 on l1.id = ld.dad
    where l.id=1
    GROUP BY l.id,l.name
    

    【讨论】:

    • 谢谢你,Yossi,它有效!但它给出的结果为'{“City A”,“City B”}'。你知道是否有可能得到“城市 A,城市 B”,没有 { } 和“”,并且在逗号后面有一个空格? (我可以在 php 或 javascript 中完成,但在 sql 中可能会更快。)
    • @Rodrigo 我已经更新了问题.. 这取决于你的版本
    • 完美!非常感谢!
    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 2013-06-05
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多