在 sql join 中合并部分重复的行
Combine partially repeated lines in sql join
我在 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",即公园在等级制度中有两个 "fathers"。
当我进行联合查询时,我得到关于这个公园的两条线:
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
我该怎么做?
尝试像这样使用 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
我在 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",即公园在等级制度中有两个 "fathers"。
当我进行联合查询时,我得到关于这个公园的两条线:
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
我该怎么做?
尝试像这样使用 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