【问题标题】:SQL Get List of Users not in RolesSQL获取不在角色中的用户列表
【发布时间】:2013-02-18 14:50:55
【问题描述】:

我有三张桌子:

  1. 用户:用户 ID、用户名
  2. 角色:角色 ID、角色名称
  3. UsersInRoles:用户 ID、角色 ID

如何获取 UserID 列表以及它们不在其中的 RolesID?

我使用的是 SQL Server 2012。

感谢您提供的任何帮助。

亚伦

【问题讨论】:

    标签: sql join


    【解决方案1】:
    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 加入表,但不删除不匹配的行。相反,当没有匹配项时,它将连接的字段保留为空。 获取字段为空的情况,其效果是仅获取不匹配的行——用户没有的角色。

    【讨论】:

      【解决方案2】:

      我认为@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
      

      【讨论】:

        【解决方案3】:

        考虑使用 LEFT JOIN 并将其与 IS NULL 条件组合。

        【讨论】:

          【解决方案4】:

          这可以使用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
          

          这里是 Fiddle 示例:http://sqlfiddle.com/#!6/46e48/1

          【讨论】:

            猜你喜欢
            • 2012-06-30
            • 2021-05-24
            • 2023-04-04
            • 2020-01-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-01
            相关资源
            最近更新 更多