我有三個表:SQL獲取列表的用戶不在角色
- 用戶:用戶名,用戶名
- 角色:角色ID,角色名
- UsersInRoles:用戶ID,角色ID
如何我是否獲得用戶ID和他們不在的RolesID的列表?
我使用SQL Server 2012的
感謝您的幫助,您可以提供。
亞倫
我有三個表:SQL獲取列表的用戶不在角色
如何我是否獲得用戶ID和他們不在的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
連接表,但不刪除不匹配的行。相反,當沒有匹配時它會將連接字段留爲空。只有字段爲空的情況下,只會獲取不匹配的行 - 用戶不具有的角色。
考慮使用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
這裏是樣品小提琴:http://sqlfiddle.com/#!6/46e48/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
這完美地工作!感謝代碼。 – Aaron 2013-02-21 15:39:05