2009-07-10 86 views
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' 

謝謝。

回答

5

第一個允許訂單爲NULL,因爲它是左連接。
第二個沒有,因爲它在連接之後檢查o.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) 
+0

這很有道理,謝謝Greg。 *尤里卡時刻* – staterium 2009-07-10 10:20:31

0

這是LEFT JOIN。

在第一種情況下,您可能會獲得更少的記錄,因爲如果他的訂單被Join中的現金條件過濾掉,則只有一個客戶將通過WHERE條件。

在第二種情況下,更多的客戶訂單對會通過,並且可能會在WHERE過濾器之後留下更多客戶訂單對。

確保你真的需要LEFT JOIN,如果是的話,那麼確定在這種情況下你需要這兩個語義中的哪一個。

0

在第一示例中,過濾條件被首先施加到過濾不同的訂單類型現金訂單,然後用客戶表接合。

在第二個示例中,連接了兩個表,然後應用過濾條件。因此結果會有所不同。