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