1

ここにクエリがあります

SELECT * FROM customers  
WHERE 
     NOT EXISTS 
     (     
          SELECT 1 FROM brochure_requests     
          WHERE  brochure_requests.first_name = customers.customer_first_name AND    
          brochure_requests.last_name = customers.customer_last_name
     )

このクエリは問題なく機能しますが、なぜ機能するのかわかりません。NOT EXISTS 部分の1SELECT 1は何のためのものか。このクエリを実行したとき

select 1 from test2

結果は次のとおりです。

1
-----
1
1
1
1
1
1
1
1
1
1
1
..

存在しないクエリはどのように機能しますか?

4

7 に答える 7

3

コンパイラは十分に賢く、実際のSELECTinを無視しEXISTSます。したがって、基本的に、フィルターが一致するために行を返す場合、それが気にするのはそれだけです...決して実行SELECTされない部分。EXISTS評価目的でのみ EXISTS 句を使用します。

あなたはこれをよく目にするので、私はかなり長い間この誤解を持っていましSELECT 1た. しかし、私は 42、* などを見てきました....実際には結果を気にすることはありません。SQL はコンパイル済み言語であるため、これを適切に最適化することに注意してください。

1/0 を置くことができ、ゼロ除算の例外はスローされません...したがって、結果セットが評価されないことがさらに証明されます。これは、この SQLFiddleに示されています

フィドルからのコード:

CREATE TABLE test (i int)
CREATE TABLE test2 (i int)

INSERT INTO test VALUES (1)
INSERT INTO test2 VALUES (1)

SELECT i
FROM test
WHERE EXISTS
(
  SELECT 1/0
  FROM test2
  WHERE test2.i = test.i
)

そして最後に、あなたの要点として、 はNOT単純に を否定しEXISTS、一致するすべての行を無視するように言っています

于 2012-04-05T16:14:13.097 に答える
1

サブクエリは、選択したフィールドのとテーブルを結合する相関サブクエリです。customersbrochure_requests

このEXISTS句は、一致する行のみを返す (およびそれをNOT否定する) 単純な述語です。

于 2012-04-05T16:15:21.787 に答える
0

クエリ:

select 1 from test2

test2 テーブルのすべてのレコードの値として値 1 を示します。

すべてのSELECTクエリには、少なくとも 1 つの列が必要です。そのため、値が 1 の名前のない列がここで使用されていると思います。

サブクエリは、関連する Customers の行を table から取得しますbrochure_requests

NOT EXISTSメインクエリは、Customersテーブルにないすべての行をテーブルから返しますbrochure_requests

于 2012-04-05T16:25:22.763 に答える
0

問題の関係演算子は、「antijoin」 (あるいは「不一致」または「半差異」) として知られています。自然言語: 共通の属性 first_name と last_name を使用して、brochure_requests に一致しない顧客。

密接に関連する演算子は、SQL などの関係差 (または「マイナス」または「除外」) です。

SELECT customer_last_name, customer_first_name
  FROM customers  
EXCEPT
SELECT last_name, first_name  
  FROM brochure_requests;
于 2012-04-10T10:37:21.450 に答える
-1

顧客がパンフレットを要求した場合、サブクエリはこの顧客に対して 1 を返します。この顧客は結果セットを返すために追加されません。NOT EXISTS 句の使用。

于 2012-04-05T16:16:05.170 に答える
-1

注: 私は Oracle を知りませんし、特に SQL の専門家でもありません。

ただし、句に一致するすべての行をSELECT 1 from単に返します。そのため、インナーは現在検討中の行の名前フィールドと一致する名前フィールドを持つ行を見つけることができ、結果を生成して.1fromselectbrochure_requestscustomer1NOT EXISTS

したがって、クエリは、一致する名前customersを持たないすべての人を選択します。brochure_request

于 2012-04-05T16:16:20.593 に答える
-2

テーブルの行ごとCustomersに、クエリは行を返しますsub-queryNOT EXISTS行を返しません。

サブクエリNOT EXISTSが行を返す場合、テーブルの行はCustomers返されません。

于 2012-04-05T16:17:06.987 に答える