在 SELECT 中不使用聚合函数时用 SELECT DISTINCT 替换 GROUP BY

Posted

技术标签:

【中文标题】在 SELECT 中不使用聚合函数时用 SELECT DISTINCT 替换 GROUP BY【英文标题】:Replacing GROUP BY by SELECT DISTINCT when not using aggregation function in SELECT 【发布时间】:2021-02-26 16:24:43 【问题描述】:

作为过去大学作业的一部分,我收到了以下嵌套 SQL 语句:

SELECT DISTINCT P.playerId
FROM Player P
WHERE (
    SELECT COUNT(G.id)
    FROM Game G
    WHERE G.playerId = P.playerId
) >10

任务是取消嵌套查询。作为考试的准备,我现在尝试再次解决这个任务,并提出了一个类似的解决方案(不是 100% 确定正确的语法,但我想意图很明确):

SELECT DISTINCT P.playerId
FROM Player P, Game G
WHERE G.playerId = P.playerId
HAVING COUNT(G.id) >10

但是,官方解决方案建议使用此查询:

SELECT P.playerId
FROM Player P, Game G
WHERE P.playerId = G.playerId
GROUP BY P.playerId
HAVING COUNT(G.id) > 10

所以,我的问题是,这是否只是一种替代解决方案,或者在使用HAVING + aggregate function 时是否不可能在没有GROUP BY 的情况下拥有SELECT DISTINCT?本质上,SELECT DISTINCTGROUP BY 的结果应该是相同的,但我只是不确定在使用 HAVING 子句时是否要省略 GROUP BY

提前感谢您对此的任何见解。

【问题讨论】:

【参考方案1】:

我认为最好的解决方案是:

SELECT G.playerId
FROM Game G
GROUP BY G.playerId
HAVING COUNT(*) > 10;

JOIN 完全没有必要。如果您确实想加入,请使用JOIN,而不是逗号。

【讨论】:

好的,有道理。但是,我想,尽管在这种情况下不需要连接,但任务的目标是让我们通过使用连接来取消嵌套查询,因为它被明确要求说明为什么特定类型的连接对于取消嵌套查询很重要. 大多数数据库不会接受没有对应GROUP BYHAVING @Samaranth 。 . .对于只需要一个表的查询的非常好奇的问题。

以上是关于在 SELECT 中不使用聚合函数时用 SELECT DISTINCT 替换 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

更改事件上的 Select2 在 Vuejs 中不起作用

google bigquery SQL group by 聚合函数

如何避免错误“WHERE 中不允许使用聚合函数”

创建 Oracle 函数 - 如何减少样板代码

递归查询中不允许使用聚合函数。有没有另一种方法来编写这个查询?

模糊查询和聚合函数