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 行,那么您将有一个有效的查询。
目前,我有一个工作正常的查询:
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 行,那么您将有一个有效的查询。