Предположим, что таблица выглядит следующим образом:
--------------------------------------------
| UserID | PropertyId | BrandId |
--------------------------------------------
| 1111 | xx1111 | A |
| 1111 | xx1112 | A |
| 1111 | xx1113 | B |
| 2222 | xx1114 | C |
| 3333 | xx1115 | B |
| 3333 | xx1116 | C |
| 4444 | xx1117 | B |
--------------------------------------------
Как найти список всех пользователей, обладающих свойствами только в торговых марках A и B, а не в C, D, E и т.д.
Итак, мой запрос должен вернуть что-то вроде этого:
---------------
| UserID |
---------------
| 1111 |
| 4444 |
---------------
Все пользовательские свойства 1111 находятся в брендах A и B. Пользователь 2222 имеет свойство в C, а также пользователь 3333.
Это должно работать:
SELECT DISTINCT UserID FROM table WHERE UserID NOT IN
(
SELECT UserID FROM table WHERE BRANDID NOT IN('A','B')
)
Я думаю, что это самый прямой перевод того, что вы сказали:
select user_id
from user_property_brand
where brand_id in ('A', 'B')
except
select user_id
from user_property_brand
where brand_id in ('C', 'D', 'E');
Он также дает правильный ответ:
user_id
---------
1111
4444
(2 rows)
SELECT DISTINCT USERID FROM USER WHERE BRANDID IN ('A','B') AND BRANDID NOT IN ('C')
SELECT DISTINCT t.UserID
FROM @t t
WHERE t.BrandId IN ('A','B')
AND NOT EXISTS (
SELECT 1
FROM @t x
WHERE t.UserID = x.UserID
AND x.BrandId IN ('C','D', 'E')
HAVING COUNT(DISTINCT BrandID) >= 1
)
group by brandID
прежде чем having
?
Надеюсь, этот код будет работать на вас.
Select distinct(userId)
from table
where brandId in ('A') and brandId in ('B') and brandId not in ('C');
SELECT DISTINCT
и работает для всей выбранной строки. Пропустите эти избыточные скобки, чтобы прояснить ситуацию, то есть select distinct userId from table ...