2015-04-13 4 views
0

Я хочу выяснить, содержит ли результат запроса точно некоторые элементы. Я объясняю: У меня есть таблица profile_stores, которая содержит управляемые запасы каждого профиля Скажем, у меня есть 5 профилей P1-> P5 и 4 магазина s1 -> s4 и моя таблица содержитКак выяснить, если результат запроса содержит точно некоторые элементы

profie | store 
------------------ 
    P1 | S1 
    P2 | S2 
    P3 | S3 
    P2 | S2 
    P1 | S2 
    P1 | S3 
    P4 | S1 
    P5 | S2 

Теперь мы имеет следующий профиль 1 P1 управляют магазинами S1 и S2 и S3

=> 
    P1(S1,S2,S3) 
    P2(S1,S2) 
    P3(S4) 
    P4(S1) 
    P5(S2) 

что я должен знать теперь, как я могу установить мой запрос, чтобы получить профили, которые управляют одновременной установку и только магазины S1 и S2 ?

Ps: В моем случае запрос должен возвращать только P2

Любая помощь будет оценена

+0

Я нахожу это немного немного трудно понять: _What мне нужно знать теперь, как я могу задать свой запрос для получения профилей, которые управляют одновременно, и только в хранилищах S1 и S2? _ P2 есть только S2, поэтому не уверен, что это в результате, – Tanner

ответ

2

GROUP BY -решением:

select profile 
from tablename 
group by profile 
having count(distinct store) = 2 
    and min(store) = 'S1' 
    and max(store) = 'S2' 

Альтернативное решение:

select profile 
from tablename t1 
where not exists (select 1 from tablename t2 
        where t1.profile = t2.profile 
        and t2.store not in ('S1', 'S2', ...)) 
group by profile 
having count(distinct store) = 2 (or 3 or 4...) 
+1

Как бы вы расширили этот метод, чтобы быть способный искать профили, которые связаны с 3 разными магазинами вместо 2? – Dan

+0

В таком случае я бы выбрал другое решение! Будет редактировать, но обещаю, что вам понравится! – jarlh

3
SELECT DISTINCT profile FROM profile_stores 
WHERE profile IN (SELECT profile FROM profile_stores WHERE store = 'S1') 
    AND profile IN (SELECT profile FROM profile_stores WHERE store = 'S2') 
    AND profile NOT IN (SELECT profile FROM profile_stores WHERE store NOT IN ('S1','S2')) 

В качестве альтернативы, использовать менее известные набор операторов (которые дают более легко читаемый код SQL в мое мнение):

SELECT profile FROM profile_stores WHERE store = 'S1' 
INTERSECT 
SELECT profile FROM profile_stores WHERE store = 'S2' 
EXCEPT 
SELECT profile FROM profile_stores WHERE store NOT IN ('S1', 'S2') 

в обоих случаях мы начинаем отфильтровывая только те профили, которые связаны с магазинов «S1» и «S2» одновременно. Из этого набора мы удалим профили, которые также связаны с другими магазинами.

Оба эти ориентированные на набор методы могут быть легко расширены до различных условий поиска. Например, чтобы найти профили, которые связаны с любым количеством магазинов, не будучи связан с другими (в целом, или специфические) и т.д.

0

другой подход

select profile from table where store = 's1' 
intersection 
select profile from table where store = 's2' 
except 
select profile from table where store not in ('s1', 's2') 
Смежные вопросы