4

以下の表をご覧ください。

顧客テーブル:

ID
Name

注文表:

ID
CustomerID

顧客は0、1、または多数の注文を行うことができます。以下のSQLクエリをご覧ください。

SELECT Customer.* 
FROM Customer LEFT JOIN Order ON Customer.ID=Order.CustomerID 
WHERE CustomerID IS NULL

SELECT Customer.* 
FROM Customer LEFT JOIN Order ON Customer.ID=Order.CustomerID AND
      CustomerID IS NULL

これら2つのクエリに違いはありますか?開発者はいつ他の手法ではなく一方の手法を使用しますか?

このような質問はオンラインで他にもあると思いましたが、答えが見つからなかったため、質問の理由がわかりませんでした。

4

5 に答える 5

2

結果セットとクエリプランに関しては、2つは同じ結果を生成する可能性があります。

その点で、それらは同じです。

可読性について話す場合WHERE、結合条件が明示的であり、WHERE句がどの結果を含める/除外するかを明示するため、バージョンを使用します。

于 2013-01-01T10:49:58.480 に答える
1

私は自分のやり方で説明しようとします:

以下の表を検討してください

tblQuestions

QuestionId                   1                    2
QuestionTitle                Your Name?           Your Age?

tblPersons

PersonId                     1                    2
PersonName                   Person1              Person2

tblAnswers

AnswerId                     1
PersonId                     1
QuestionId                   1
Answer                       My Name is Person1

ここで、 WHEREを使用してこのクエリを試してください。結果は、 1つだけ返されます。

SELECT  q.QuestionId, q.QuestionName, a.Answer
FROM    tblQuestions q
        LEFT OUTER JOIN tblAnswers a ON q.QuestionId = a.QuestionId
WHERE   a.PersonId = 2 OR a.PersonId IS null

このクエリをONで試してみると、2つの結果が返されます。

SELECT  q.QuestionId, q.QuestionName, a.Answer 
FROM    tblQuestions q 
        LEFT OUTER JOIN tblAnswers a ON q.QuestionId = a.QuestionId AND
    (a.PersonId = 2 OR a.PersonId IS null)

結果の違いは、ファイラーによるものですPersonId = 1 OR PersonId Is NULL。このフィルターを結果に適用するWHEREと1レコード、「ON」内に適用すると結果は2レコードになります。

于 2013-01-01T12:08:36.877 に答える
0

結果を考慮すると、どちらも同じ結果を返します。違いがあります。最初のクエリ、

SELECT Customer.* 
FROM Customer LEFT JOIN Order ON Customer.ID=Order.ID 
WHERE CustomerID IS NULL

最初に結合を適用してレコードを取得し、その上にフィルター(Where)条件を適用します。

2番目のクエリ、

SELECT Customer.* 
FROM Customer LEFT JOIN Order ON Customer.ID=Order.ID AND
      CustomerID IS NULL

ここで、参加自体の間に、望ましい結果が得られます。パフォーマンスに関しては、これは良いことです。

これが理にかなっていることを願っています!!

于 2013-01-01T10:52:34.307 に答える
0

最初のケースは、where条件を満たす結果を返します

2番目のケースは、両方の条件で結合する結果を返します

于 2013-01-01T10:57:29.097 に答える
0

選択した回答が正しくありません。

最初のクエリは、注文のないすべての顧客に提供されます。2番目のクエリはすべての顧客に提供します。

最初のクエリでは、注文のある顧客が注文に参加します。左参加のため、ご注文のないお客様がいらっしゃいます。次に、Whereが適用されます。CustomerIDがnullでないため、注文のある顧客は除外されます。注文のない顧客は残ります。

2番目のクエリでは、どのデータを入力しても、レコードを結合できないため、注文のないすべての顧客が存在します。これらの両方が真になる結合条件はありません(ニトピッカーのコーナー:ヌルIDの顧客レコードとヌルIDの注文レコードがあり、 "SET ANSI_NULLS OFF"宣言を使用しない限り): "Customer.ID = Order .ID AND CustomerID ISNULL"。

于 2013-01-03T22:02:39.297 に答える