1

次のようなデータが格納されたテーブルが Oracle DB にあります。

ROLE_ID | USER_ID
------------------
 14     | USER A
 15     | USER A
 11     | USER B
 13     | USER A
 15     | USER B
 12     | USER C
 15     | USER C

USER_ID13 と 15 の両方を持つすべての sを取得したいROLE_ID。上記の例に基づいて、返されるのは だけですUSER_A

以下にクエリを書くと

select * from table where ROLE_ID in (13,15);その後、他のユーザーも取得します。

戻るだけになるようにクエリを変更するにはどうすればよいですかUSER A

4

4 に答える 4

7

あなたが探しているのは...

select user_id
  from my_table
 where role_id in (13,15)
 group by user_id.
having count(distinct role_id) = 2

個別を使用することで、たとえば 2 つの USER A がある場合でも、両方role_idの sを持つ 1 つを取得できることを保証します

于 2012-08-28T19:42:09.157 に答える
3

これを試して

SELECT USER_ID FROM table WHERE ROLE_ID=13
        INTERSECT
SELECT USER_ID FROM table WHERE ROLE_ID=15
于 2012-08-28T19:43:53.077 に答える
0

内部結合でこれを行うことができます:

SELECT DISTINCT t1.USER_ID
FROM table t1
JOIN table t2 
 ON t2.USER_ID = t1.USER_ID 
 AND t2.ROLE_ID=15
WHERE t1.ROLE_ID=13
于 2012-08-28T20:07:29.350 に答える
0

HAVNIG 句のみでこれを行います。

select user_id
from t
group by user_id
having max(case when role_id = 13 then 1 else 0 end) = 1 and
       max(case when role_id = 15 then 1 else 0 end) = 1

HAVING 句でこれらの条件を表現すると、最も柔軟性が高くなることがわかりました。「and」条件、「or」条件を使用したり、結果を13 と 15 のユーザーのみに制限したり、同じ基本構造を使用したものを使用したりできます。

于 2012-08-28T20:16:22.710 に答える