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 子句的主要内容,如果未能解决你的问题,请参考以下文章
计算在JPA中使用“group by”和“have”过滤的行数
在 sql 查询中使用 group/order by 和 union 子句
使用多个 WHERE 子句和 GROUP BY 销售人员访问 SQL、聚合总和