0

给定场景:

table fd  
(cust_id, fd_id) primary-key and amount  

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

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

询问:

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。

4

4 回答 4

4

GROUP BY 在这种情况下可以省略,因为列表中只有(一个)聚合函数,SELECT并且所有行都保证属于同一组cust_id(由WHERE子句)。

在这两种情况下,聚合将覆盖所有匹配的行cust_id。所以这两个查询都是正确的。


这将是实现相同事物的另一种更清洁的方法:

SELECT fd.cust_id
FROM   fd
JOIN   loan USING (cust_id)
GROUP  BY fd.cust_id, fd.amount
HAVING fd.amount < sum(loan.amount)

一个区别(cust_id, amount):具有相同in 的行在fd我的查询结果中只出现一次,而它们会在原始结果中出现多次。

无论哪种方式,如果table 中没有非 null 的匹配行,则根本 没有行。我假设你知道这一点。amountloan

于 2011-12-27T14:46:45.287 回答
2

没有必要,GROUP BY因为您过滤了数据cust_id。无论如何,内部查询将返回相同的结果。

于 2011-12-27T14:47:41.987 回答
2

不,不是,因为您计算sum(amount)的是客户id = fd.cust_id,所以是单个客户。

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

于 2011-12-27T14:48:02.703 回答
1

具有类似聚合sum但没有 a的查询group by将输出一组。将在所有匹配的行上计算聚合。

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

where 1 > (... subquery ...)

所以group by必须省略;您甚至会在第二次查询时遇到错误。

注意当您指定所有、任何或某些子查询时,可以返回多行:

where 1 > ALL (... subquery ...)

但是很容易看出为什么这对您的情况没有意义。您会将一位客户的数据与另一位客户的数据进行比较。

于 2011-12-27T14:47:56.197 回答