私は3つのテーブルを持っています:
- ユーザー:UserID、UserName
- ロール:RoleID、RoleName
- UsersInRoles:UserID、RoleID
UserIDとそれらが含まれていないRolesIDのリストを取得するにはどうすればよいですか?
SQLServer2012を使用しています。
あなたが提供できるどんな助けにも感謝します。
アーロン
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の場合のみを取得すると、一致しない行(ユーザーにはないロール)のみを取得する効果があります。
@ 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の使用を検討し、それをISNULL条件と組み合わせます。
これは、とを使用して機能し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