[英]SQL query: how to filter a many to many relationship
我有一個表,包含一個 clientID 和一個 subclientID,如何過濾它以重新運行包含 BASE 和 1 ONLY的客戶端。 在這種情況下,我想返回客戶端 46
客戶端ID | 子客戶端ID |
---|---|
44 | 1個 |
44 | 9 |
44 | 根據 |
44 | 2個 |
45 | 根據 |
45 | 2個 |
46 | 根據 |
46 | 1個 |
46 | 1個 |
編輯:子客戶端可能包含重復項
聚合是這里的一種選擇:
SELECT clientID
FROM yourTable
GROUP BY clientID
HAVING MIN(subclientID) <> MAX(subclientID) AND
COUNT(CASE WHEN subclientID NOT IN ('1', 'BASE') THEN 1 END) = 0;
這是找到它的一種方法:
select clientid
from (
select clientid,
case when subclientid in ('BASE', '1') then 1 else 2 end as score
from test
) x
group by clientid
having sum(score) = 2;
解釋
select clientid,
case when subclientid in ('BASE', '1') then 1 else 2 end as score
from test
會將BASE
和1
更改為分數 1。其他所有內容都將獲得分數 2。結果將如下所示:
客戶編號 | 得分------:| -----: 44 | 1 44 | 2 44 | 1 44 | 2 45 | 1 45 | 2 46 | 1 46 | 1個
然后,對於每個 clientid,我們總結分數。 如果分數恰好是 2,我們知道我們需要那個客戶 ID。
例子
如果你有重復,你可以使用這個:
select clientid
from (
select clientid,
case when subclientid in ('BASE', '1') then 1 else 2 end as score
from (select distinct clientid, subclientid from test) t
) x
group by clientid
having sum(score) = 2;
示例: https://dbfiddle.uk/?rdbms=postgres_14&fiddle=29590e13e0603bc675167950da05114b
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.