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_ID具有 13 和 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

通过使用 distinct,您可以确保如果有两个 USER A,您仍然会得到一个同时具有两个role_ids

于 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 子句中表述这些条件提供了最大的灵活性。您可以使用“和”条件、“或”条件,将结果限制为具有 13 和 15 的用户,或使用相同基本构造的任何用户。

于 2012-08-28T20:16:22.710 回答