【问题标题】:Join with all values match in second table加入第二个表中的所有值匹配
【发布时间】:2021-01-22 08:58:57
【问题描述】:

我有 3 个表用户、用户角色、角色。 我正在尝试选择具有确切角色的用户。

SELECT *
FROM Users
LEFT JOIN UserRoles ON UserRoles.UserId = Users.UserId
LEFT JOIN Roles ON Roles.RoleId = UserRoles.RoleId
WHERE Roles.RoleId IN (1,2)

我得到了有效的结果,但是我得到的用户也只在 RoleId = 1 或只在 RoleId = 2。

如何仅选择包含 2 个(或更多)确切角色的用户?

【问题讨论】:

  • 您想要这些用户的哪些详细信息?我假设你并不是真的想要SELECT *
  • @Larnu Users.UserId 例如
  • LEFT JOIN 在您编写查询时没有用处
  • @JoeTaras 我明白,但我不太擅长 SQL,所以你能详细说明一下或给我一个提示吗?谢谢

标签: sql sql-server database tsql


【解决方案1】:

如果您想确保两个角色都存在,您可以测试这两个角色,例如

SELECT *
FROM Users U
WHERE EXISTS (
  SELECT 1
  FROM UserRoles UR
  INNER JOIN Roles R ON R.RoleId = UR.RoleId
  WHERE UR.UserId = U.UserId and R.RoleId = 1
)
AND EXISTS (
  SELECT 1
  FROM UserRoles UR
  INNER JOIN Roles R ON R.RoleId = UR.RoleId
  WHERE UR.UserId = U.UserId and R.RoleId = 2
);

为了清楚起见,请注意使用别名。还有inner join,因为不应该有空的情况。

【讨论】:

    【解决方案2】:

    如果您想要拥有 2 个或更多角色的用户的用户 ID,请使用 HAVING

    SELECT U.UserID
    FROM dbo.Users U
         JOIN dbo.UserRoles UR ON U.UserID = UR.UserID
         JOIN dbo.Roles R ON UR.RoleID = R.RoleID
    GROUP BY U.UserID
    HAVING COUNT(R.RoleID) >= 2;
    

    如果你想让他们有特定的角色,你只需添加WHERE 来限制他们;就像你在尝试中所做的那样。如果您正在寻找 3 个特定角色,只需确保将 HAVING 更改为 >=3(或适当的数字)。

    【讨论】:

      【解决方案3】:

      您可以使用如下解析函数:

      select * from
      (SELECT u.*, count(distinct Roles.RoleId) over (partition by Users.UserId) as cnt
      FROM Users
      LEFT JOIN UserRoles ON UserRoles.UserId = Users.UserId
      LEFT JOIN Roles ON Roles.RoleId = UserRoles.RoleId
      WHERE Roles.RoleId IN (1,2) ) t
      where cnt = 2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多