1

我有三张桌子:

  1. 用户:用户 ID、用户名
  2. 角色:角色 ID、角色名称
  3. UsersInRoles : 用户 ID、角色 ID

如何获取用户 ID 列表以及它们不在其中的角色 ID?

我正在使用 SQL Server 2012。

感谢您的任何帮助,您可以提供。

亚伦

4

4 回答 4

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加入表,但不删除不匹配的行。相反,当没有匹配项时,它将连接的字段保留为空。获取字段为空的情况具有仅获取不匹配的行的效果——用户没有的角色。

于 2013-02-18T14:54:52.497 回答
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
于 2013-02-18T15:00:15.807 回答
0

这适用于 aCROSS JOIN和 a LEFT 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

于 2013-02-18T14:54:04.893 回答
0

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

于 2013-02-18T14:52:55.100 回答