SQL子查询和group by生成具有相同值的行
目前,我有一个很好的查询: 从Batting中选择teamID、yearID、AVGHBP作为AVGHBP\ 按teamID、yearID分组\ 由avgHBP DESC订购\ 限值5; 结果:SQL子查询和group by生成具有相同值的行,sql,sqlite,group-by,subquery,Sql,Sqlite,Group By,Subquery,目前,我有一个很好的查询: 从Batting中选择teamID、yearID、AVGHBP作为AVGHBP\ 按teamID、yearID分组\ 由avgHBP DESC订购\ 限值5; 结果: | teamID | yearID | avgHBP | |--------|--------|--------| | BLN | 1898 | 6.67 | | BL3 | 1891 | 6.16 | | BLN | 1897 | 5.75 | | BLN
| teamID | yearID | avgHBP |
|--------|--------|--------|
| BLN | 1898 | 6.67 |
| BL3 | 1891 | 6.16 |
| BLN | 1897 | 5.75 |
| BLN | 1896 | 5.45 |
| BLN | 1895 | 5.30 |
| teamID | yearID | avgHBP |
|--------|--------|--------|
| BLN | 1871 | 4.44 |
| CL5 | 1871 | 3.93 |
| BL3 | 1871 | 3.86 |
| BFP | 1871 | 3.69 |
| TL2 | 1871 | 3.55 |
但是,当我尝试添加子查询时,除了尝试学习子查询之外,没有其他原因,
我明白了:
选择teamID,从Batting中选择yearID作为yearID2,从Batting中选择AVGHBP作为AVGHBP\
按团队ID分组,年份ID2\
由avgHBP DESC订购\
限值5;
结果:
| teamID | yearID | avgHBP |
|--------|--------|--------|
| BLN | 1898 | 6.67 |
| BL3 | 1891 | 6.16 |
| BLN | 1897 | 5.75 |
| BLN | 1896 | 5.45 |
| BLN | 1895 | 5.30 |
| 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
select max(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 yearID from Batting
select max(yearID) from Batting
它只返回1行,那么您将有一个有效的查询。简而言之,除了SQLite和MySql之外,几乎所有rdbms中的这个查询都是错误的,因为根据ANSII SQL,在GROUP BY查询中,SELECT子句中的所有表达式也必须列在GROUP BY子句中functions@krokodilko子查询的结果别名为yearID2,并在GROUPBY子句中使用。所以这不是问题所在。