SQL: Найти всех пользователей, которые имеют свойства в данном списке брендов.

0

Предположим, что таблица выглядит следующим образом:

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

Теги:
sql-server

5 ответов

1
Лучший ответ

Это должно работать:

SELECT DISTINCT UserID FROM table WHERE UserID NOT IN 
(
   SELECT UserID FROM table WHERE BRANDID  NOT IN('A','B')
)
  • 0
    Это похоже на левое внешнее соединение, верно?
1

Я думаю, что это самый прямой перевод того, что вы сказали:

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)
0
SELECT DISTINCT USERID FROM USER WHERE BRANDID IN ('A','B') AND BRANDID NOT IN ('C')
  • 0
    Вернет нежелательные 3333.
  • 0
    Хорошая точка зрения. Обновлено.
Показать ещё 2 комментария
0
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
                )
  • 0
    Вам не нужна group by brandID прежде чем having ?
0

Надеюсь, этот код будет работать на вас.

Select distinct(userId) 
from table 
where brandId in ('A') and brandId in ('B') and brandId not in ('C');
  • 0
    Не может быть в «A» и «B» одновременно.
  • 0
    DISTINCT не является функцией столбца, это часть SELECT DISTINCT и работает для всей выбранной строки. Пропустите эти избыточные скобки, чтобы прояснить ситуацию, то есть select distinct userId from table ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню