首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >下面的相关子查询中是否需要GROUP BY?

下面的相关子查询中是否需要GROUP BY?
EN

Stack Overflow用户
提问于 2011-12-27 22:42:03
回答 3查看 1.6K关注 0票数 0

给定场景:

代码语言:javascript
运行
复制
table fd  
(cust_id, fd_id) primary-key and amount  

table loan  
(cust_id, l_id) primary-key and amount

我想列出所有定期存款少于所有贷款总和的客户。

查询:

代码语言:javascript
运行
复制
SELECT cust_id
  FROM fd
    WHERE amount
     <
    (SELECT sum(amount)
        FROM loan
          WHERE fd.cust_id = loan.cust_id);

OR should we use

SELECT cust_id
  FROM fd
    WHERE amount
     <
    (SELECT sum(amount)
        FROM loan
          WHERE fd.cust_id = loan.cust_id group by cust_id);

一个客户可以有多个贷款,但一次只考虑一个FD。

EN

回答 3

Stack Overflow用户

发布于 2011-12-27 22:47:42

由于您已按cust_id过滤数据,因此不需要GROUP BY。在任何情况下,内部查询都将返回相同的结果。

票数 2
EN

Stack Overflow用户

发布于 2011-12-27 22:48:03

不,它不是,因为您使用id = fd.cust_id计算客户的sum(amount),所以对于单个客户也是如此。

但是,如果您的子查询以某种方式计算多个客户的sum,group by将导致子查询生成多个行,这将导致条件(<)失败,从而导致查询失败。

票数 2
EN

Stack Overflow用户

发布于 2011-12-27 22:47:56

具有诸如sum之类的聚合但没有group by的查询将输出一个组。将对所有匹配的行计算聚合。

条件子句中的子查询只能返回一行。如果子查询返回多行,下面的表达式是什么意思?

代码语言:javascript
运行
复制
where 1 > (... subquery ...)

因此必须省略group by;您甚至会在第二次查询时得到一个错误。

注意:当您指定all, any, or some时,子查询可以返回多个行:

代码语言:javascript
运行
复制
where 1 > ALL (... subquery ...)

但很容易理解为什么这在您的情况下没有意义;您会将一个客户的数据与另一个客户的数据进行比较。

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

https://stackoverflow.com/questions/8645853

复制
相关文章

相似问题

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