3

このクエリの動作を理解できません。すべての商品を注文した顧客の名前を返すことになっています。

Rは、顧客 ID (cid) とアイテム ID (iid) を含む顧客によるアイテム注文のテーブルを参照します。

アイテムIDを含む注文可能なアイテムのテーブルを参照します

Cは顧客 ID を持つ顧客テーブルです

SELECT cname
FROM Customer C
WHERE NOT EXISTS
(  (SELECT I.iid
       FROM Item I)
    EXCEPT
   (SELECT R.iid
      FROM Order R
      WHERE R.cid=C.cid))

私が推測するところによると、SELECT R.iid を使用した一番下のネストされたクエリは、任意の顧客が注文したすべてのアイテムを取得します。

次に、SELECT I.iid を使用した上記のネストされたクエリは、以下のクエリで除外することにより、以前に注文されていないすべてのアイテムを検索します。

ネストされている場合、NOT EXISTS はどのステートメントを評価しますか? R.cid = C.cid は FROM 顧客 C のせいですか? . どうすれば最終結果にたどり着くのかわかりません。助けてくれてありがとう。

4

2 に答える 2

2

分解してください。後方/最も内側のクエリから開始:

これは、顧客が注文したアイテム ID のリストを返します。(iid は Item ID の略で、R の fk であると仮定しています)

SELECT R.iid FROM Order R WHERE R.cid=C.cid

これは、顧客がすでに注文したものを除いて、(一般に) アイテム ID のリストを返します。

SELECT I.iid FROM Item I EXCEPT...

最後に、これは、リスト内のアイテムの 1 つを注文していない、注文していない顧客のリストを返します。

SELECT cname FROM Customer C Where NOT EXISTS...

つまり、基本的には、少なくとも 1 つすべてを注文した顧客を探しています。

于 2013-02-27T23:14:10.240 に答える
0

SELECT I.iid FROM Item I「すべてのアイテムのID」を意味します。

SELECT R.iid FROM Order R WHERE R.cid=C.cidC「顧客がこれまでに注文したすべてのアイテムの ID」を意味します(C含まれているクエリによって決定されます)。

一般に、 「によって返され、返されないquery1 EXCEPT query2すべての行」を意味します。特定のケースでは、「顧客が注文したことのないすべての商品の ID」を意味します。query1query2(SELECT I.iid FROM Item I) EXCEPT (SELECT R.iid FROM Order R WHERE R.cid=C.cid)C

式の中NOT EXISTS (subquery)で本当に重要なのはsubquery、行を返すかどうか (「存在する」場合) だけです。顧客が注文したことのない(SELECT I.iid FROM Item I) EXCEPT (SELECT R.iid FROM Order R WHERE R.cid=C.cid)商品がある場合は存在し、そのような商品がない場合は存在しませんC

したがって、クエリ全体として、すべての商品を注文した顧客の名前が検索されます。

于 2013-02-27T23:16:44.913 に答える