我有一個將帳戶映射到用戶的表。帳戶可以有多個用戶。用戶可以在多個帳戶中。
account_id | user_id
------------ ---------
1234 a
1234 b
5678 c
6789 a
例如,這里的用戶“a”在賬戶 1234 和 6789 中。
我有另一個包含帳戶詳細資訊的表格。
account_id | status | ...
------------ ------------ -----
1234 ACTIVE
5678 ACTIVE
6789 SUSPENDED
我想知道在一個帳戶中處于活動狀態而在另一個帳戶中被暫停的所有用戶。(任何組合,如果他們在超過 2 個帳戶中。)在上面的示例中,用戶“a”在 1234 中處于活動狀態,在 6789 中處于暫停狀態。
我的嘗試始于...
SELECT user_id FROM mappings
LEFT JOIN account_details AS x ON account_id = x.id AND x.status = 'ACTIVE'
LEFT JOIN account_details AS y ON account_id = y.id AND y.status = 'SUSPENDED'
但這似乎是錯誤的,我不知道如何確保 2 個連接鏈接到同一個用戶。必須有一種不同的方法來解決我沒有看到的這個問題。
感謝您的任何提示。
uj5u.com熱心網友回復:
您可以加入表以按用戶聚合并在HAVING子句中設定條件:
SELECT m.user_id
FROM mappings m INNER JOIN account_details a
ON a.account_id = m.account_id
WHERE a.status IN ('ACTIVE', 'SUSPENDED')
GROUP BY m.user_id
HAVING COUNT(DISTINCT a.status) = 2;
如果 'ACTIVE' 和 'SUSPENDED' 是該列唯一可能的值,status那么您可以省略該WHERE子句。
請參閱演示。
uj5u.com熱心網友回復:
假設 Microsoft SQL Server;如果您使用不同的 DBMS,適應起來應該不會太難:
SELECT
id, ...
FROM
users As u
WHERE
Exists
(
SELECT 1
FROM mappings As m
INNER JOIN account_details As a
ON a.id = m.account_id
WHERE m.user_id = u.id
AND a.status = 'ACTIVE'
)
AND
Exists
(
SELECT 1
FROM mappings As m
INNER JOIN account_details As a
ON a.id = m.account_id
WHERE m.user_id = u.id
AND a.status = 'SUSPENDED'
)
;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/428238.html
上一篇:Oracle-如何連接具有相同FK且它們之間沒有其他相關性的多個表。避免行重復
下一篇:在具有兩行的兩個表之間連接
