SQL 子查询和分组依据产生具有相同值的行

SQL subquery and group by produces rows with same values

目前,我有一个工作正常的查询:

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之后应用了子查询吗?如果我想添加一个子查询,正确的方法是什么?

子查询:

select yearID from Batting

returns 多于 1 行(实际上它 returns 与 table Batting 中的行一样多)和在任何其他 rdbms 中,此查询:

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

无效。

但是 SQLite 允许它并且 returns 只有 1 行,这是未定义的

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

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

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

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

针对您的问题:

If I wanted to add a subquery, what would be the proper way to do it?

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

select max(yearID) from Batting

其中 returns 只有 1 行,那么您将有一个有效的查询。