質問

次の2つのクエリは異なる結果が得られ、なぜ誰も私に説明してくださいできますか?

SELECT
    o.*
FROM
    Customer c
LEFT JOIN 
    [Order] o ON o.CustomerID = c.CustomerID AND o.OrderType = 'Cash'
WHERE
    c.Country = 'USA'

SELECT
    o.*
FROM
    Customer c
LEFT JOIN 
    [Order] o ON o.CustomerID = c.CustomerID
WHERE
    c.Country = 'USA'
AND
    o.OrderType = 'Cash'

感謝します。

役に立ちましたか?

解決

それは左の参加ですので、

最初のものは、順序はNULLにすることができます。
それは参加後o.OrderTypeの値をチェックするように、第2の一方はない。

当量(OrderTypeがNULLであることができないと仮定して)であろう

SELECT
    o.*
FROM
    Customer c
LEFT JOIN 
    [Order] o ON o.CustomerID = c.CustomerID
WHERE
    c.Country = 'USA'
AND
    (o.OrderType = 'Cash' OR o.OrderType IS NULL)

他のヒント

これは、LEFT JOINはいます。

彼の注文が参加して現金条件により除外された場合にのみ、一人の顧客は、WHERE条件に通過するため、

最初のインスタンスでは、少ないレコードを取得することがあります。

第二の例では、より多くの顧客注文のペアが通過し、さらには、WHEREフィルタの後に残されてもよい。

あなたが本当にLEFTを必要とし、JOIN、およびもしそうなら、あなたはこのような場合に必要なこれらの二つの意味論のどちらを確認していることを確認します。

最初の例では、フィルタ条件は、一次型現金の注文をフィルタリングするために適用され、その後、顧客テーブルと結合しました。

は、第2の例では、2つのテーブルが結合されて、次いで濾過条件が適用されます。したがって、結果は異なります。

scroll top