目前,我有一个很好的查询:
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之后吗?如果我想添加一个子查询,那么正确的方法是什么?
发布于 2020-09-26 20:45:27
子查询:
select yearID from Batting返回超过1行(实际上返回的行与表Batting中的行相同),在任何其他关系数据库管理系统中,此查询:
SELECT teamID, (select yearID from Batting) as yearID2, AVG(HBP) as avgHBP
FROM Batting
GROUP BY teamID, yearID2是无效的。
但是SQLite允许它,并且只返回1行,,它是未定义的。
简而言之,您的查询是无效的,尽管它不会引发错误(仅在SQLite中)。
所获得的结果与执行的结果相同:
SELECT teamID, AVG(HBP) as avgHBP
FROM Batting
GROUP BY teamID有一个额外的列,这是子查询的未定义返回的yearID。
关于你的问题:
如果我想添加一个子查询,那么正确的方法是什么?
答案是没有关于如何添加子查询的一般规则。
这要视需要而定。
例如,如果您使用此子查询:
select max(yearID) from Batting它只返回1行,那么您将有一个有效的查询。
https://stackoverflow.com/questions/64082244
复制相似问题