我有三张桌子:
如何获取UserID列表以及它们不在的RolesID?
我正在使用SQL Server 2012。
感谢您提供的任何帮助。
亚伦
答案 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 JOIN
和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