1

私は3つのテーブルを持っています:

  1. ユーザー:UserID、UserName
  2. ロール:RoleID、RoleName
  3. UsersInRoles:UserID、RoleID

UserIDとそれらが含まれていないRolesIDのリストを取得するにはどうすればよいですか?

SQLServer2012を使用しています。

あなたが提供できるどんな助けにも感謝します。

アーロン

4

4 に答える 4

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の場合のみを取得すると、一致しない行(ユーザーにはないロール)のみを取得する効果があります。

于 2013-02-18T14:54:52.497 に答える
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
于 2013-02-18T15:00:15.807 に答える
0

LEFT JOINの使用を検討し、それをISNULL条件と組み合わせます。

于 2013-02-18T14:52:55.100 に答える
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

于 2013-02-18T14:54:04.893 に答える