PostgreSQL WHERE IN 子句变体
PostgreSQL WHERE IN clause variation
虚构的例子
SELECT products_campaign.id
FROM products_campaign
INNER JOIN products_store ON products_campaign.id_campaign = products_store.id_campaign
WHERE products_store.id_store in (100, 200, 300)
GROUP BY id
这为我带来了商店中的每个产品 ID 100、200 或 300。
我想构建一个查询,为我提供商店 100、200 AND 300 中的每个产品 ID,也就是说,该产品必须存在于所有三个商店中(相交)。
SELECT products_campaign.id
FROM products_campaign
INNER JOIN (
SELECT pc.id, count(distinct ps.id_store)
FROM products_campaign pc
INNER JOIN products_store ps
ON pc.id_campaign = ps.id_campaign
AND ps.id_store in (100,200,300)
GROUP BY pc.id
HAVING count(distinct ps.id_store) = 3
) intersection
ON intersection.id = products_campaign.id
INNER JOIN products_store
ON products_campaign.id_campaign = products_store.id_campaign
GROUP BY products_campaign.id
这应该可以解决问题。
SELECT products_campaign.id
FROM products_campaign
INNER JOIN (SELECT * FROM products_store WHERE id_store = 100) AS a
ON products_campaign.id_campaign = a.id_campaign
INNER JOIN (SELECT * FROM products_store WHERE id_store = 200) AS b
ON products_campaign.id_campaign = a.id_campaign
INNER JOIN (SELECT * FROM products_store WHERE id_store = 300) AS c
ON products_campaign.id_campaign = a.id_campaign
GROUP BY id
如果没有,请post你的创建table语句,并显示你期望的输出
您可以将 array_agg()
与运算符 @>
:
一起使用
SELECT products_campaign.id
FROM products_campaign
INNER JOIN (
SELECT id_campaign
FROM products_store
GROUP BY id_campaign
HAVING (array_agg(id_store) @> array[100, 200, 300])
) products_store
ON products_campaign.id_campaign = products_store.id_campaign
GROUP BY id
了解 array operators。
虚构的例子
SELECT products_campaign.id
FROM products_campaign
INNER JOIN products_store ON products_campaign.id_campaign = products_store.id_campaign
WHERE products_store.id_store in (100, 200, 300)
GROUP BY id
这为我带来了商店中的每个产品 ID 100、200 或 300。
我想构建一个查询,为我提供商店 100、200 AND 300 中的每个产品 ID,也就是说,该产品必须存在于所有三个商店中(相交)。
SELECT products_campaign.id
FROM products_campaign
INNER JOIN (
SELECT pc.id, count(distinct ps.id_store)
FROM products_campaign pc
INNER JOIN products_store ps
ON pc.id_campaign = ps.id_campaign
AND ps.id_store in (100,200,300)
GROUP BY pc.id
HAVING count(distinct ps.id_store) = 3
) intersection
ON intersection.id = products_campaign.id
INNER JOIN products_store
ON products_campaign.id_campaign = products_store.id_campaign
GROUP BY products_campaign.id
这应该可以解决问题。
SELECT products_campaign.id
FROM products_campaign
INNER JOIN (SELECT * FROM products_store WHERE id_store = 100) AS a
ON products_campaign.id_campaign = a.id_campaign
INNER JOIN (SELECT * FROM products_store WHERE id_store = 200) AS b
ON products_campaign.id_campaign = a.id_campaign
INNER JOIN (SELECT * FROM products_store WHERE id_store = 300) AS c
ON products_campaign.id_campaign = a.id_campaign
GROUP BY id
如果没有,请post你的创建table语句,并显示你期望的输出
您可以将 array_agg()
与运算符 @>
:
SELECT products_campaign.id
FROM products_campaign
INNER JOIN (
SELECT id_campaign
FROM products_store
GROUP BY id_campaign
HAVING (array_agg(id_store) @> array[100, 200, 300])
) products_store
ON products_campaign.id_campaign = products_store.id_campaign
GROUP BY id
了解 array operators。