-1

次のようなデータを含むテーブルがあるとします。

ROLE_ID | USER_ID  |  CODE
---------------------------------
 14     | USER A   |   001
 15     | USER A   |   002
 11     | USER B   |   004
 13     | USER D   |   005
 13     | USER A   |   001
 15     | USER B   |   009
 15     | USER D   |   005
 12     | USER C   |   004
 15     | USER C   |   008
 13     | USER D   |   007
 15     | USER D   |   007

13と15のrole_idのみを持つユーザーIDとコードを取得したいと思います。したがって、上記のデータに基づいて、私は以下を返したいと思います

USER D |  005
USER D |  007

以下のクエリがありますが、両方ではなく、一方のみが返されます。

   SELECT a.user_id, a.code
   FROM my_table a
   WHERE a.ROLE_ID in (13,15,11,14)
   group by a.USER_ID, a.code
    having sum( case when a.role_id in (13,15) then 1 else 0 end) = 2
    and sum( case when a.role_id in (11,14) then 1 else 0 end) = 0  
   ORDER BY USER_ID

上記のクエリは

USER D |  005

それよりも

USER D |  005
USER D |  007
4

4 に答える 4

4

英語で自分の単語を聞くだけで、SQLが最も読みやすくなる場合があります。

SELECT DISTINCT a.user_id, a.code
   FROM my_table a
   WHERE a.user_id in 
       (SELECT b.user_id
       FROM my_table b
       WHERE b.ROLE_ID = 13)
    AND a.user_id in 
       (SELECT b.user_id
       FROM my_table b
       WHERE b.ROLE_ID = 15)
   AND a.user_id NOT IN 
       (SELECT b.user_id
       FROM my_table b
       WHERE b.ROLE_ID NOT IN (13,15))
于 2012-08-29T03:05:07.343 に答える
0

私はそうします:

SELECT a.user_id, a.code 
FROM my_table a
GROUP BY a.user_id, a.code 
HAVING sum(case when a.role_id in (13, 15) then 1 else 3 end) = 2

:)

于 2012-08-29T06:13:15.810 に答える
-1
SELECT user_id, code FROM my_table
WHERE role_id = 13
INTERSECT
SELECT user_id, code FROM my_table
WHERE role_id = 15
于 2012-08-29T07:20:31.807 に答える