用于检索角色的SQL查询

时间:2018-01-02 07:08:14

标签: sql sql-server tsql

我有一个规范化的模式,包括一个User表(带有UserID列和其他数据列,如FirstName,LastName等),UserRole表(带有UserID和RoleID列)和一个Role表(带有RoleID)列和其他数据列,如RoleName,RoleDescription等。

我在一个由所有用户组成的结果集之后,基本上就像

SELECT * FROM Users

但我还想知道这些用户是否也是管理员,而没有进入n + 1场景。 Admin是Role表中存在的角色。角色和用户与UserRole表链接。

架构不灵活,所以我必须使用我所拥有的,所以我的问题是我可以运行一个SQL查询,这给了我一些简单的“是”所有用户列表中的内容如果他们是管理员,还是“不”?

更新:我还想补充一个用户可以属于多个角色,我想忽略所有非管理员角色。

4 个答案:

答案 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