SQL 将 2 个连接与同一个连接进行比较 table

SQL to compare 2 joins to the same table

我有一个 table 可以将帐户映射到用户。帐户可以有多个用户。用户可以在多个帐户中。

account_id  | user_id 
------------+---------
1234          a
1234          b
5678          c
6789          a

例如,此处用户“a”在帐户 1234 和 6789 中。

我还有另一个 table 有帐户详细信息。

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 个连接链接到同一用户。必须有一种不同的方法来解决我没有看到的这个问题。

感谢任何提示。

假设微软 SQL 服务器;如果您使用不同的 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'
    )
;

您可以加​​入表以按用户聚合并在 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 子句。

参见demo