Получить идентификатор, связанный только с данным списком значений - PullRequest
1 голос
/ 13 мая 2019

У меня есть простая таблица, скажем

customerid    clientid
----------------------
4567          1
5678          1
1298          2
4567          2
5678          2
4567          3 

Я хочу получить клиенту только со списком идентификаторов клиентов, так что для
customerid в (4567,5678) клиенте должно быть 1,
cutomerid в (4567) клиенте должно быть 3

SELECT clientid 
FROM customer_client 
WHERE customerid IN (4567,5678) 
GROUP BY clientid 
HAVING COUNT(customerid) = 2

Это возвращает

clientid
---------
1
2

, в то время как все, что я хочу, это

clientid
---------
1

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Попробуйте это-

SELECT DISTINCT clientid
FROM customer_client
WHERE customerid IN (4567,5678) 

EXCEPT 

SELECT DISTINCT clientid
FROM customer_client
WHERE  customerid NOT IN (4567,5678)
1 голос
/ 13 мая 2019
with t (customerid, clientid) as (values
  (4567, 1)
, (5678, 1)
, (1298, 2)
, (4567, 2)
, (5678, 2)
, (4567, 3)
)
, l (customerid) as (values
--4567, 5678
--4567
4567, 5678, 1298
)
select g1.clientid
from (
  select t.clientid, count(1) cnt
  from t
  join l on l.customerid=t.customerid
  group by t.clientid
) g1
join (
  select clientid, count(1) cnt
  from t 
  group by clientid
) g2 on g1.clientid=g2.clientid and g1.cnt=g2.cnt and g1.cnt=(select count(1) from l);

Вам не нужно указывать количество идентификаторов клиентов (которые могут отличаться в зависимости от примера) где-либо в операторе выбора в соответствующем списке идентификаторов.
Просто список этих идентификаторов.

1 голос
/ 13 мая 2019

Переместить условия в предложение having. Если у вас нет дубликатов, вы можете сделать:

SELECT cc.clientid
FROM customer_client cc
GROUP BY cc.clientid
HAVING SUM(CASE WHEN cc.customerid IN (4567, 5678) THEN 1 ELSE 0 END) = COUNT(*) AND
       COUNT(*) = 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...