Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL子查询和group by生成具有相同值的行_Sql_Sqlite_Group By_Subquery - Fatal编程技术网

SQL子查询和group by生成具有相同值的行

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

目前,我有一个很好的查询:

从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    | 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子句中使用。所以这不是问题所在。