【问题标题】:Replacing GROUP BY by SELECT DISTINCT when not using aggregation function in SELECT在 SELECT 中不使用聚合函数时用 SELECT DISTINCT 替换 GROUP BY
【发布时间】: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

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

【问题讨论】:

    标签: sql group-by query-optimization having unnest


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,有道理。但是,我想,尽管在这种情况下不需要连接,但任务的目标是让我们通过使用连接来取消嵌套查询,因为它被明确要求说明为什么特定类型的连接对于取消嵌套查询很重要.
    • 大多数数据库不会接受没有对应GROUP BYHAVING
    • @Samaranth 。 . .对于只需要一个表的查询的非常好奇的问题。
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2020-11-05
    • 2020-07-16
    • 2023-03-10
    • 2016-08-14
    相关资源
    最近更新 更多