2016-07-18 2 views
0

Вымышленный примерPostgreSQL WHERE вариации в операторе

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 

Это приносит мне каждый идентификатор продукта, который находится в магазине 100, 200 ИЛИ 300.
Я хочу построить запрос, который дает мне каждый продукт id, который находится в запасе 100, 200 И 300, то есть продукт должен существовать во всех трех магазинах (пересекаться).

ответ

1

Вы можете использовать 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 ,

+0

Можете ли вы разместить ссылку на документацию или что-то, объясняющее оператор '@>', пожалуйста? –

+1

Оператор '@>' означает просто 'contains', см. Ссылку в отредактированном ответе. – klin

1
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 
1

Это должно сделать трюк.

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 

Если это не так, пожалуйста, напишите ваши создавать операторы таблицы, и показать, что вы ожидаете в качестве выхода