SQL获取不在角色中的用户列表

时间:2013-02-18 14:50:56

标签: sql join

我有三张桌子:

  1. 用户:UserID,UserName
  2. 角色:RoleID,RoleName
  3. UsersInRoles:UserID,RoleID
  4. 如何获取UserID列表以及它们不在的RolesID?

    我正在使用SQL Server 2012。

    感谢您提供的任何帮助。

    亚伦

4 个答案:

答案 0 :(得分:2)

select users.userid, roles.roleid
    from users
    cross join roles
    left outer join usersinroles on
        usersinroles.userid = users.userid and
        usersinroles.roleid = roles.roleid
    where usersinroles.userid is null

cross join将每个角色加入每个用户。

left outer join加入表,但不删除不匹配的行。相反,当没有匹配时,它将连接的字段保留为null。只获取 字段为null的情况会导致只获取不匹配的行 - 用户没有的角色。

答案 1 :(得分:1)

我认为@ dan1111的解决方案更好,但这个解决方案可能更具可读性:

SELECT u.Userame,
    r.RoleName
FROM Users u
CROSS JOIN Roles r

EXCEPT

SELECT u.Userame,
    r.RoleName
FROM Users u
INNER JOIN UsersInRoles ur
    on u.UserID = ur.UserID
INNER JOIN Roles r
    on ur.RoleID = r.RoleID

答案 2 :(得分:0)

考虑使用LEFT JOIN并将其与IS NULL条件组合。

答案 3 :(得分:0)

这可以使用CROSS JOINLEFT JOIN

SELECT U.UserId, R.RoleId
FROM Roles R CROSS JOIN Users U
   LEFT JOIN UserRoles UR ON U.UserId = UR.UserId AND R.RoleId = UR.RoleId
WHERE UR.UserId IS NULL

以下是示例小提琴:http://sqlfiddle.com/#!6/46e48/1