查询修改where子句以指定关系

时间:2020-09-08 12:48:40

标签: sql

我有2个表:users和user_roles

users:
id   name
1    John
2    Doe
user_roles:
user_id role
1       admin
1       finance
1       accounting
2       admin
2       finance
2       admin

我想让在输出中具有管理员和财务角色的用户(具有不同)。

因此结果将仅是ID为2(Doe)的用户

最佳的SQL解决方案是什么?

4 个答案:

答案 0 :(得分:0)

您可以尝试以下解决方案:

C:\Program Files\nodejs\
C:\Users\SSD\AppData\Roaming\npm
C:\Program Files\Git\cmd
C:\Users\SSD\AppData\Local\Programs\Python\Python38-32
C:\Users\SSD\AppData\Local\Programs\Python\Python38-32\Scripts
C:\Program Files\Git\bin

答案 1 :(得分:0)

这应该有效。

select * from users 
where exists (select 1 from user_roles where user_id=users.id and role='admin')
and exists (select 1 from user_roles where user_id=users.id and role='finance')
and not exists (select 1 from user_roles where user_id=users.id and role not in ('admin','finance'))

最好的问候,
比尼亚尼

答案 2 :(得分:0)

我建议使用having子句进行聚合:

select u.id, u.name
from users u join
     user_roles ur
     on ur.user_id = u.id
group by u.id, u.name
having count(distinct case when u.role in ('admin', 'finance') then u.role end) = 2;

或者:

select u.id, u.name
from users u join
     user_roles ur
     on ur.user_id = u.id
where u.role in ('admin', 'finance') 
group by u.id, u.name
having count(distinct u.role) = 2;

答案 3 :(得分:0)

大家好,我找到了解决方案。这样可能会帮助与我有相同问题的人

select u.id, u.name
from users u
INNER join user_roles ur on ur.user_id = u.id
group by u.id, u.name
having
    COUNT(DISTINCT(CASE WHEN ur.role IN ('admin', 'finance') THEN ur.role END)) = 2
    AND COUNT(DISTINCT(CASE WHEN ur.role NOT IN ('admin', 'finance') THEN ur.role END)) = 0