2013-02-18 44 views
1

我有三個表:SQL獲取列表的用戶不在角色

  1. 用戶:用戶名,用戶名
  2. 角色:角色ID,角色名
  3. UsersInRoles:用戶ID,角色ID

如何我是否獲得用戶ID和他們不在的RolesID的列表?

我使用SQL Server 2012的

感謝您的幫助,您可以提供。

亞倫

回答

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連接表,但不刪除不匹配的行。相反,當沒有匹配時它會將連接字段留爲空。只有字段爲空的情況下,只會獲取不匹配的行 - 用戶不具有的角色。

+0

這完美地工作!感謝代碼。 – Aaron 2013-02-21 15:39:05

0

考慮使用LEFT JOIN和與IS NULL條件結合起來。

0

這個工程使用CROSS JOINLEFT 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

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