2015-01-15 30 views
0

我有以下的UserRole表了许多用户和角色选择记录到许多表使用SQL GROUPBY和具有

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

回答

3

一种方式做到这一点

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

这里是一个SQLFiddle演示

+0

@desigeek有没有帮助? – peterm

+0

是的。谢谢,它确实有帮助。仍然不明白这是如何工作的。 – desigeek

0

这里是另一种方式:

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