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