3

以下は、一時テーブルからの結果です。
注意: 以下のデータは単なるサンプルなので、ハードコードされたクエリは必要ありません。あらゆる種類のデータに対して機能するクエリが必要です。

値 = 1 はユーザーがロールを持っていることを意味し、0 はユーザーがロールを持っていないことを意味します。行 1 のように、テスト 1 には役割 A がありますが、役割 D はありません。

以下の場合のクエリが必要です。

Role ID = ( A,B,C,D ) 少なくとも 1 つのロールが割り当てられているユーザーのみが必要な場合のケース #1 。ユーザー テスト 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 (少なくとも 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 デモ

CASE #2 (すべてのロールが it に割り当てられている)

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

最終結果 (ユーザーのすべてのレコード) を取得するには、以下のクエリの 1 つ (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: 少なくとも 1 つのロールを持つユーザー

  select username
    from tbl
   where value = 1
group by username

CASE 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 に答える