2

次の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'

ありがとう。

4

4 に答える 4

5

最初のものは左結合であるため、順序を NULL にすることができます。
2 つ目は、結合後に o.OrderType の値をチェックするため、そうではありません。

同等のものは次のようになります (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)
于 2009-07-10T10:06:42.883 に答える
0

最初の例では、フィルター条件は最初に注文タイプが現金の注文をフィルター処理するために適用され、次に顧客テーブルと結合されます。

2 番目の例では、2 つのテーブルが結合され、フィルター条件が適用されます。したがって、結果は異なります。

于 2013-02-26T07:36:20.033 に答える
0

それはLEFT JOINです。

最初の例では、注文が Join の Cash 条件によって除外された場合、1 人の顧客だけが WHERE 条件を通過するため、レコードが少なくなる可能性があります。

2 番目のインスタンスでは、より多くの顧客と注文のペアが通過し、WHERE フィルターの後にさらに多くのペアが残る可能性があります。

本当に LEFT JOIN が必要かどうかを確認し、必要な場合は、この場合に必要な 2 つのセマンティクスを確認してください。

于 2009-07-10T10:10:28.367 に答える
0

素晴らしい説明:

専門家に聞く: 外部結合に関するテリー パーセル

于 2009-07-10T13:16:18.057 に答える