2016-10-14 8 views
0

これまで同様の質問がありましたが、2つ以上のテーブルについては見たことがありません。そして違いがあるようです。SQL EXISTSは2つ以上のテーブルを持つすべての行を返します

私は私が私がorderIDquantity(=数量が発注した)を取得、そこからcustomerIDorderIDlineitemsを取得ordersそこからフィールドを、私はからcustomerIDorderIDが必要customersを、必要があるから、3つのテーブルを持っています。それは私にすべての行の数を返している理由を私は理解していない

SELECT COUNT(DISTINCT custID) 
FROM customers 
WHERE EXISTS(
    SELECT * 
    FROM customers C, orders O, lineitems L 
    WHERE C.custID = O.custID AND O.orderID = L.orderID AND L.quantity > 2 
    ); 

は、私は多くの顧客がそう基本的に、同じ項目の2つ以上を買ったと数量> 2か知りたいです。 > 2の条件をチェックする前にサブクエリを相関させていますか?そうではありませんか?

私は初心者ですので、必要に応じて基本的に私に説明していただければ幸いです。ありがとう。

答えて

2

サブクエリEXISTScustomersテーブルを繰り返す必要はありません。これは相関の考え方です。相関をとるために外部クエリのテーブルを使用します。

SELECT COUNT(DISTINCT custID) 
FROM customers c 
WHERE EXISTS(
    SELECT * 
    FROM orders O 
    JOIN lineitems L ON O.orderID = L.orderID 
    WHERE C.custID = O.custID AND L.quantity > 2 
    ); 
+0

これは、お客様をもう一度繰り返すことによって発生しますか?または、 'FROM ... WHERE ... 'の代わりに' JOIN'を使用すると、複数のテーブルを使うときに違いがありますか? – sandboxj

+1

@sandboxjはいこのエラーは、再び「顧客」という表が使用されていることに起因します。これは相関の考え方に打ち勝ちます。カンマで区切った古い形式の構文の代わりに、上記のクエリのような現代的な 'JOIN'構文を使用することも好ましいです。 –

1

私は2件の集計としてこれをアプローチします:

select count(distinct customerid) 
from (select o.customerid, l.itemid, count(*) as cnt 
     from lineitems li join 
      orders o 
      on o.orderID = l.orderId 
     group by o.customerid, l.itemid 
    ) ol 
where cnt >= 2; 

内側のクエリは、各顧客が購入したアイテムの数をカウントします。外側は顧客の数を数えます。

EDIT:

私は上記の答えのための質問を誤解している可能性があります。あなただけのどこquantity >= 2たい場合は、それははるかに簡単です:

select count(distinct o.customerid) 
from lineitems li join 
    orders o 
    on o.orderID = l.orderId 
where l.quantity >= 2; 

これはおそらく、クエリを表現する最も簡単な方法です。

0

は私が

この

はインナー が l.orderID = o.orderIDに のLineItemsリットル に参加 COUNT(*)O からの受注を選択してください、あなたは "ジョイン" を使用することをお勧め l.quantity> 2

関連する問題