2012-10-24 101 views
3

以下結果來自臨時表。
請注意:下面的數據只是一個示例,所以我不需要硬編碼查詢,我需要一個適用於各種數據的查詢。根據角色選擇值

值= 1表示用戶有角色,0表示用戶沒有角色。 與第一行相似測試1具有角色A但不是角色D.

我需要查詢以下情況。

案例1當Role ID = (A,B,C,D) 我只需要分配至少一個角色的用戶。 我應該回來用戶測試1,測試2和測試3.測試4將不會因爲沒有角色分配給它。

案例#2當Role ID = (A,B,C,D)。 我只需要將所有角色分配給它的用戶。 我應該得到4行用戶測試2。

Username值角色ID
Testing1 1所述的
Testing1 1乙
Testing1圖1C
Testing1 0 d
Testing2 1所述的
Testing2 1乙
Testing2圖1C
Testing2 1 d
測試3 1 A
測試3 1 B
Testing3圖1C
Testing3 0 d
Testing4 0
Testing4 0 B
Testing4 0℃
Testing4 0 d

+1

你有沒有試過? – Yatrix

+0

*什麼 - 顯然我沒有試過檢查錯別字。 – Yatrix

回答

1

CASE#1(具有ATLEAST一個角色分配

SELECT b.* 
FROM 
    (
     SELECT DISTINCT [username], Value 
     FROM tableName 
     WHERE value = 1 
    ) a 
     INNER JOIN TableName b 
     ON a.username = b.username 
WHERE a.value = 1 

SQLFiddle Demo

CASE#2(具有分配給它所有角色)

SELECT username 
FROM tableName 
WHERE RoleID IN ('A','B','C','D') 
GROUP BY username 
HAVING COUNT(DISTINCT roleID) = 4 

SQLFiddle Demo

+0

謝謝你,但是對於案例#1,我需要獲取所有4行的用戶名。測試1與所有4個角色。返回的行總數應爲12 – Ally

+0

你說'測試4將不會被分配到它的角色。' –

+0

是我同意但您的查詢將只返回3行...不是12行 – Ally

0

爲了讓您的最終結果(所有記錄用戶),採取的一個查詢(CASE X),並將它加回到整個表格,例如對於案例1:

select t.* 
    from (
      select username 
      from tbl 
      where value = 1 
     group by username) g 
    join tbl t on t.username = g.username 
order by t.username, t.roleid 

案例1:用戶誰至少有一個角色

select username 
    from tbl 
    where value = 1 
group by username 

案例2:用戶誰擁有所有角色(未知角色的數量)

select username 
    from tbl 
    where value = 1 
group by username 
    having count(distinct roleid) = (select count(distinct roleid) from tbl) 

CASE 2:具有所有角色(預先知道的角色數量,例如A,B,C,D => 4)的用戶

select username 
    from tbl 
    where value = 1 
group by username 
    having count(distinct roleid) = 4