【问题标题】:SQL subquery and group by produces rows with same valuesSQL 子查询和分组依据产生具有相同值的行
【发布时间】:2021-01-12 20:37:32
【问题描述】:

目前,我有一个运行良好的查询:

SELECT teamID, yearID, AVG(HBP) as avgHBP FROM Batting \
GROUP BY teamID, yearID \
ORDER BY avgHBP DESC \
LIMIT 5;

结果:

| teamID | yearID | avgHBP |
|--------|--------|--------|
| BLN    | 1898   | 6.67   |
| BL3    | 1891   | 6.16   |
| BLN    | 1897   | 5.75   |
| BLN    | 1896   | 5.45   |
| BLN    | 1895   | 5.30   |

但是,当我尝试添加子查询时(除了尝试学习子查询之外没有其他原因), 我明白了:

SELECT teamID, (select yearID from Batting) as yearID2, AVG(HBP) as avgHBP FROM Batting \
GROUP BY teamID, yearID2 \
ORDER BY avgHBP DESC \
LIMIT 5;

结果:

| teamID | yearID | avgHBP |
|--------|--------|--------|
| BLN    | 1871   | 4.44   |
| CL5    | 1871   | 3.93   |
| BL3    | 1871   | 3.86   |
| BFP    | 1871   | 3.69   |
| TL2    | 1871   | 3.55   |

所有列只考虑第一年 (1871)。

这是因为子查询是在group by 之后应用的吗?如果我想添加一个子查询,那么正确的方法是什么?

【问题讨论】:

    标签: sql sqlite group-by subquery


    【解决方案1】:

    子查询:

    select yearID from Batting
    

    返回超过 1 行(实际上它返回的行数与表 Batting 中的行数一样多)以及在任何其他 rdbms 中,此查询:

    SELECT teamID, (select yearID from Batting) as yearID2, AVG(HBP) as avgHBP 
    FROM Batting 
    GROUP BY teamID, yearID2
    

    无效。

    但 SQLite 允许它并仅返回 1 行,未定义

    简而言之,您的查询是无效的 SQL,尽管它不会引发错误(仅在 SQLite 中)。

    你得到的结果和你执行的一样:

    SELECT teamID, AVG(HBP) as avgHBP 
    FROM Batting 
    GROUP BY teamID
    

    有 1 个额外的列,即子查询的未定义返回 yearID

    对于您的问题:

    如果我想添加子查询,正确的方法是什么?

    答案是没有关于如何添加子查询的一般规则
    这取决于要求。
    例如,如果您使用此子查询:

    select max(yearID) from Batting
    

    只返回 1 行,那么您将有一个有效的查询。

    【讨论】:

    • 严格来说,除了 SQLite 和 MySql 之外,几乎所有 rdbms 中这个查询都是错误的,因为根据 ANSII SQL,在 GROUP BY 查询中,SELECT 子句中的所有表达式也必须在 GROUP BY 子句中列出。不是聚合函数
    • @krokodilko 子查询的结果别名为yearID2,并在 GROUP BY 子句中使用。所以这不是这里的问题。
    猜你喜欢
    • 1970-01-01
    • 2023-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多