【发布时间】:2013-02-18 14:50:55
【问题描述】:
我有三张桌子:
- 用户:用户 ID、用户名
- 角色:角色 ID、角色名称
- UsersInRoles:用户 ID、角色 ID
如何获取 UserID 列表以及它们不在其中的 RolesID?
我使用的是 SQL Server 2012。
感谢您提供的任何帮助。
亚伦
【问题讨论】:
我有三张桌子:
如何获取 UserID 列表以及它们不在其中的 RolesID?
我使用的是 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
【讨论】:
考虑使用 LEFT JOIN 并将其与 IS NULL 条件组合。
【讨论】:
这可以使用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
这里是 Fiddle 示例:http://sqlfiddle.com/#!6/46e48/1
【讨论】: