使用 SQL Groupby 在多对多 table 中选择记录并具有

selecting records in a many to many table using SQL Groupby and having

对于用户和角色之间的多对多关系,我有以下 UserRole table

UserRoleId | UserId | RoleId
------------------------
1          | 1      | A
2          | 1      | B
3          | 1      | C
4          | 2      | A
5          | 3      | B
6          | 3      | C
7          | 4      | C

我希望能够 select 符合以下条件的用户: 1)只有一个角色 2)那个角色是A

所以在上面的 table 中,只有 UserRoleId 4 应该返回,因为它满足两个条件。使用 groupby 并让我能够找到只有一个角色的 userId,但无法包含对第二个条件的检查。

select userId, count(userId)
from UserRole
group by userId
having COUNT(userId) = 1

如何使用 groupbyhaving 完成此操作?

一种方法

SELECT userId
  FROM UserRole
 GROUP BY userId
HAVING COUNT(*) = SUM(CASE WHEN RoleId = 'A' THEN 1 ELSE 0 END)
| USERID |
|--------|
|      2 |

这是一个SQLFiddle演示

这是另一种方式:

SELECT 
    UserId
FROM UserRole
GROUP BY UserId
HAVING
    SUM(CASE WHEN RoleId = 'A' THEN 1 ELSE 0 END) = 1
    AND SUM(CASE WHEN RoleId <> 'A' THEN 1 ELSE 0 END) = 0