目前,我有一个运行良好的查询:
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
返回多于1行(实际上返回的行与table中的行一样多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行,那么您将有一个有效的查询。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句