获取 INNER JOIN 的结果作为数组列,不重复

Get result of INNER JOIN as array column, without duplicates

我有 2 个 simlpe 表,例如 product(id, name)product_countries_rel(id, country_id, product_id)。 IE。每个产品可以有多个国家。

简单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 列将包含以逗号分隔的 country_ids。 IE。我想要这个:

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

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

在 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