获取 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
我有 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