簡體   English   中英

SQL 查詢:如何過濾多對多關系

[英]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

會將BASE1更改為分數 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM