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);

顧客は複数のローンを持つことができますが、一度に1つのFDが考慮されます。

4

4 に答える 4

4

GROUP BY リストには (1 つの) 集計関数しかなく、すべての行が(節によって)SELECTの同じグループに属することが保証されているため、この場合は省略できます。cust_idWHERE

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)

1 つの違いがあります。同一(cust_id, amount)の行fdはクエリの結果に 1 回だけ表示されますが、元の行には複数回表示されます。

どちらの方法でも、 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

集計 like を使用するsumが a を使用しないクエリは、 group by1 つのグループを出力します。集計は、一致するすべての行に対して計算されます。

条件句のサブクエリは、1 行のみを返すことができます。サブクエリが複数の行を返した場合、次の式は何を意味するでしょうか?

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

したがって、group byを省略する必要があります。2 番目のクエリでもエラーが発生します。

注意all、any、または someを指定すると、サブクエリは複数の行を返すことができます。

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

しかし、あなたのケースではそれが意味をなさない理由は簡単にわかります。ある顧客のデータを別の顧客のデータと比較します。

于 2011-12-27T14:47:56.197 に答える