首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL子查询和组by生成具有相同值的行。

SQL子查询和组by生成具有相同值的行。
EN

Stack Overflow用户
提问于 2020-09-26 20:29:24
回答 1查看 27关注 0票数 1

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

代码语言:javascript
复制
SELECT teamID, yearID, AVG(HBP) as avgHBP FROM Batting \
GROUP BY teamID, yearID \
ORDER BY avgHBP DESC \
LIMIT 5;

结果:

代码语言:javascript
复制
| teamID | yearID | avgHBP |
|--------|--------|--------|
| BLN    | 1898   | 6.67   |
| BL3    | 1891   | 6.16   |
| BLN    | 1897   | 5.75   |
| BLN    | 1896   | 5.45   |
| BLN    | 1895   | 5.30   |

但是,当我尝试添加子查询(除了尝试学习子查询之外)时,我得到如下结果:

代码语言:javascript
复制
SELECT teamID, (select yearID from Batting) as yearID2, AVG(HBP) as avgHBP FROM Batting \
GROUP BY teamID, yearID2 \
ORDER BY avgHBP DESC \
LIMIT 5;

结果:

代码语言:javascript
复制
| 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之后吗?如果我想添加一个子查询,那么正确的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-26 20:45:27

子查询:

代码语言:javascript
复制
select yearID from Batting

返回超过1行(实际上返回的行与表Batting中的行相同),在任何其他关系数据库管理系统中,此查询:

代码语言:javascript
复制
SELECT teamID, (select yearID from Batting) as yearID2, AVG(HBP) as avgHBP 
FROM Batting 
GROUP BY teamID, yearID2

是无效的。

但是SQLite允许它,并且只返回1行,,它是未定义的

简而言之,您的查询是无效的,尽管它不会引发错误(仅在SQLite中)。

所获得的结果与执行的结果相同:

代码语言:javascript
复制
SELECT teamID, AVG(HBP) as avgHBP 
FROM Batting 
GROUP BY teamID

有一个额外的列,这是子查询的未定义返回的yearID

关于你的问题:

如果我想添加一个子查询,那么正确的方法是什么?

答案是没有关于如何添加子查询的一般规则。

这要视需要而定。

例如,如果您使用此子查询:

代码语言:javascript
复制
select max(yearID) from Batting

它只返回1行,那么您将有一个有效的查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64082244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档