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 行的 User Testing2。

用户名 值 角色 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 天

4

2 回答 2

1

案例#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 演示

案例#2(将所有角色分配给它

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

SQLFiddle 演示

于 2012-10-24T01:19:58.560 回答
0

要获得最终结果(用户的所有记录),请使用以下查询之一(CASE X)并将其连接回完整表,例如对于 CASE 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
于 2012-10-24T01:32:07.720 回答