2015-01-15 32 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