SQL Group By and Have 子句和 exists 子句

Posted

技术标签:

【中文标题】SQL Group By and Have 子句和 exists 子句【英文标题】:SQL Group By and Having clause and exists clause 【发布时间】:2021-10-21 02:43:04 【问题描述】:

这些查询从多个表(AspNetUsers、AspNetUserRoles 和 AspNetRoles)中获取记录。记录将仅包括那些拥有多个角色的用户。 我正在寻找第一个查询有效而后者无效的原因。任何帮助将不胜感激。

查询 1:

SELECT 
    U.Id,
    U.UserName
    ,R.Id
    ,R.Name AS RoleName
FROM AspNetUsers  AS U
JOIN AspNetUserRoles UR
    ON U.Id  = UR.UserId
JOIN AspNetRoles AS R
    ON R.Id = UR.RoleId
WHERE EXISTS (
        SELECT UserId,
            COUNT() AS NumberofRoles
            FROM AspNetUserRoles
            GROUP BY UserId
            HAVING COUNT() > 1)   

查询 2:(仅当我删除 R.Id 和 R.Name 时才有效,否则无效)

SELECT 
    U.Id,
    U.UserName
    ,R.Id
    ,R.Name AS RoleName
FROM AspNetUsers  AS U
JOIN AspNetUserRoles UR
    ON U.Id  = UR.UserId
JOIN AspNetRoles AS R
    ON R.Id = UR.RoleId
GROUP BY U.Id,U.UserName

为了更清楚,附上表格图。

【问题讨论】:

在您的第二个查询中,SELECT 列和 GROUP BY 列不一致。查询应该返回一个编译错误。 刚刚了解 SELECT 中的 GROUP BY 和 AGGREGATION 函数 那么简单来说,SELECT列和GROUP BY列应该是一样的吧? EXISTS 需要一个相关子查询。我会在这里使用IN (<subquery>) SELECT U.Id, U.UserName ,R.Id AS RoleID ,R.Name AS RoleName FROM AspNetUsers AS U JOIN AspNetUserRoles UR ON U.Id = UR.UserId JOIN AspNetRoles AS R ON R.Id = UR.RoleId WHERE U.Id IN (SELECT COUNT(*) FROM AspNetUserRoles GROUP BY UserId HAVING COUNT(*) > 1) 这只返回一个用户的记录。为什么它不返回所有具有多个角色的用户的记录 【参考方案1】:

第二个查询没有用,因为您还没有定义任何称为 R 的东西。

【讨论】:

请再看一遍,(JOIN AspNetRoles AS R),R 已定义 是的,但你必须在第一次加入之前定义它【参考方案2】:

试试这个:

SELECT 
    U.Id,
    U.UserName
    ,R.Id
    ,R.Name AS RoleName
FROM AspNetUsers  AS U
JOIN AspNetUserRoles UR
    ON U.Id  = UR.UserId
JOIN AspNetRoles AS R
    ON R.Id = UR.RoleId
GROUP BY U.Id,U.UserName,R.Id,R.Name

【讨论】:

是的,这是有效的。但这将返回所有记录。我实际上只寻找那些具有多个角色的记录。谢谢你 您能否在您的问题或 sqlfiddle 链接中将示例数据提供为表格格式会更好?【参考方案3】:

这将是获取具有多个角色的记录的正确方法。

SELECT 
    U.Id,
    U.UserName
    ,R.Id AS RoleID
    ,R.Name AS RoleName
FROM AspNetUsers  AS U
JOIN AspNetUserRoles UR
    ON U.Id  = UR.UserId
JOIN AspNetRoles AS R
    ON R.Id = UR.RoleId
WHERE U.Id IN (SELECT UserId FROM AspNetUserRoles GROUP BY UserId HAVING COUNT(*) > 1)

【讨论】:

以上是关于SQL Group By and Have 子句和 exists 子句的主要内容,如果未能解决你的问题,请参考以下文章

Group By 和 Have 子句描述

计算在JPA中使用“group by”和“have”过滤的行数

在 sql 查询中使用 group/order by 和 union 子句

使用多个 WHERE 子句和 GROUP BY 销售人员访问 SQL、聚合总和

group by cno having count(*) between 100 and 150); 是啥意思?

Sql order by 和 group BY 如何共同运用?