【问题标题】:selecting records in a many to many table using SQL Groupby and having使用 SQL Group By 选择多对多表中的记录并具有
【发布时间】:2015-01-15 04:49:58
【问题描述】:

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

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

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

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

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

如何使用groupbyhaving 完成此操作?

【问题讨论】:

    标签: sql-server group-by having


    【解决方案1】:

    一种方法

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

    这是一个SQLFiddle演示

    【讨论】:

    • @desigeek 有帮助吗?
    • 是的。谢谢,它确实有帮助。仍然不明白这是如何工作的。
    【解决方案2】:

    这是另一种方式:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 1970-01-01
      • 2022-12-08
      • 1970-01-01
      • 2023-03-17
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多