我有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解决方案是什么?
答案 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