单个表上的内部查询

时间:2012-08-28 19:38:58

标签: sql oracle

我的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的{​​{1}},其中包含13和15的ROLE_ID。根据上面的示例,我应该只返回USER_A

如果我写下面的查询

select * from table where ROLE_ID in (13,15);然后我也得到了其他用户。

如何修改查询以便我只返回USER A

4 个答案:

答案 0 :(得分:7)

你正在寻找......

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

通过使用distinct,你可以确保如果有两个用户A,你仍然可以得到一个role_id

答案 1 :(得分:3)

试试这个

SELECT USER_ID FROM table WHERE ROLE_ID=13
        INTERSECT
SELECT USER_ID FROM table WHERE ROLE_ID=15

答案 2 :(得分: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

答案 3 :(得分: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的 用户,或使用相同基本构造的任何用户。