我有三张桌子:
- 用户:用户 ID、用户名
- 角色:角色 ID、角色名称
- UsersInRoles : 用户 ID、角色 ID
如何获取用户 ID 列表以及它们不在其中的角色 ID?
我正在使用 SQL Server 2012。
感谢您的任何帮助,您可以提供。
亚伦
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
加入表,但不删除不匹配的行。相反,当没有匹配项时,它将连接的字段保留为空。仅获取字段为空的情况具有仅获取不匹配的行的效果——用户没有的角色。
我认为@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
这适用于 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
考虑使用 LEFT JOIN 并将其与 IS NULL 条件结合使用。