Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql联接中合并部分重复的行_Sql_Postgresql_Hierarchy - Fatal编程技术网

在sql联接中合并部分重复的行

在sql联接中合并部分重复的行,sql,postgresql,hierarchy,Sql,Postgresql,Hierarchy,我在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 这

我在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

我如何才能做到这一点?

试着像这样使用array\u 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

尝试如下使用数组_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

谢谢你,尤西,这很有效!但它给出的结果是{“城市A”,“城市B”}。你知道不带{}和“”,在逗号后加空格,是否可以得到“城市A,城市B”?(我可以用php或javascript来做,但用sql可能会更快。)@Rodrigo我已经更新了这个问题。。这取决于你的版本完美!谢谢!谢谢你,尤西,这很有效!但它给出的结果是{“城市A”,“城市B”}。你知道不带{}和“”,在逗号后加空格,是否可以得到“城市A,城市B”?(我可以用php或javascript来做,但用sql可能会更快。)@Rodrigo我已经更新了这个问题。。这取决于你的版本完美!谢谢!