我有一个规范化的模式,包括一个User表(带有UserID列和其他数据列,如FirstName,LastName等),UserRole表(带有UserID和RoleID列)和一个Role表(带有RoleID)列和其他数据列,如RoleName,RoleDescription等。
我在一个由所有用户组成的结果集之后,基本上就像
SELECT * FROM Users
但我还想知道这些用户是否也是管理员,而没有进入n + 1场景。 Admin是Role表中存在的角色。角色和用户与UserRole表链接。
架构不灵活,所以我必须使用我所拥有的,所以我的问题是我可以运行一个SQL查询,这给了我一些简单的“是”所有用户列表中的内容如果他们是管理员,还是“不”?
更新:我还想补充一个用户可以属于多个角色,我想忽略所有非管理员角色。
答案 0 :(得分:3)
您可以对Admin角色的两个表执行左连接,并通过检查右表是否包含该用户来查看是否存在匹配:
select u.*,
case when ur.UserID is null then 'No' else 'Yes' end as isAdmin
from users u
left join UserRole ur
on u.UserID = ur.UserID
left join Role r
on ur.RoleID = r.RoleID
and r.RoleName = 'Admin';
答案 1 :(得分:1)
如果用户有多个角色且其中一个角色是Admin,则应该有一个" Y"在isAdmin列中。它应该是每个用户一行,包括分配了多个角色的那些。
select
u.*,
case when r.roleid is null then 'N'
else 'Y'
end as isAdmin
from user u
left join (select ur.userid, ur.roleid
from userrole ur
join role rl
on ur.roleid = rl.roleid
where rl.rolename = 'Admin' ) r
on u.userid = r.userid
答案 2 :(得分:0)
您可以获取用户名为admin的所有用户列表。
<强>查询:强>
SELECT * ,
case r.Role
WHEN 'Admin' THEN 'Yes'
ELSE 'NO'
END as ISAdmin
FROM User as u
INNER JOIN UserRole as ur on ur.UserId = u.Id
INNER JOIN Role as r on ur.RoleId = r.id
SQLFiddler:http://sqlfiddle.com/#!9/208789/5
答案 3 :(得分:0)
SELECT A.*,CASE WHEN B.Role_id = 1 --Here should be the id of the admin role
THEN 'Yes' ELSE 'No' END AS IsAdmin
FROM Users A
JOIN UserRole B ON A.User_id = B.User_id
JOIN Roles C ON B.Role_Id = C.Role_Id