根据角色选择值

时间:2012-10-24 01:15:00

标签: sql sql-server tsql

以下来自临时表的结果 请注意:下面的数据只是一个示例,因此我不需要硬编码查询,我需要一个适用于各种数据的查询。

值= 1表示用户具有角色,0表示用户没有角色。 与第一行类似,测试1具有角色A但不具有角色D.

我需要查询以下案例。

Role ID = ( A,B,C,D )时的案例#1 我只需要分配了至少一个角色的用户。 我应该回到用户测试1,测试2和测试3.测试4将不会到来,因为没有分配任何角色。

案例#2 Role ID = ( A,B,C,D )时。 我只需要具有分配给它的所有角色的用户。 我应该让User Testing2有4行。

  

用户名值角色ID
  测试1 1 A
  测试1 1 B
  测试1 1 C
  测试1 0 D
  测试2 1 A
  测试2 1 B
  测试2 1 C
  测试2 1 D
  测试3 1 A
  测试3 1 B
  测试3 1 C
  测试3 0 D
  测试4 0 A
  测试4 0 B
  测试4 0 C
  测试4 0 D

2 个答案:

答案 0 :(得分:1)

CASE#1(至少分配了一个角色

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

答案 1 :(得分: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)

案例2:拥有所有角色的用户(事先知道的角色数量,例如A,B,C,D => 4)

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