获取INNER JOIN作为数组列的结果,没有重复项

时间:2015-03-05 13:13:53

标签: database postgresql inner-join

我有2个simlpe表,例如产品(ID,名称) product_countries_rel(id,country_id,product_id)。即每个产品可以有多个国家。

简单INNER JOIN查询:

SELECT p.id, p.name, pcr.country_id FROM product p INNER JOIN product_countries_rel pcr ON p.id = pcr.product_id

会给出这个结果:

 id    |      name    | country_id 
--------+-------------------------+-----------
     1 | ProductName1 | 23
     1 | ProductName1 | 25
     2 | ProductName2 | 56
     2 | ProductName2 | 57

但我希望获得一条product countries列的记录,其中包含逗号delimeted country_ids。即我想要这个:

 id    |      name    | country_ids 
--------+-------------------------+-----------
     1 | ProductName1 | 23,25
     2 | ProductName2 | 56,57

如何实现这一目标?如果它很重要 - 我正在使用PostgreSQL 9.3。

1 个答案:

答案 0 :(得分:1)

在Postgresql 9+版本中,您可以使用string_agg执行此操作:

SELECT p.id, p.name, string_agg(cast(pcr.country_id as varchar(5)), ',') 
FROM product p INNER JOIN product_countries_rel pcr ON p.id = pcr.product_id
GROUP BY p.id, p.name

在旧版本中,使用array_agg函数构建数组并使用array_to_string将其作为分隔字符串,可以实现相同的结果:

SELECT p.id, p.name, array_to_string(array_agg(pcr.country_id), ',') 
FROM product p INNER JOIN product_countries_rel pcr ON p.id = pcr.product_id
GROUP BY p.id, p.name