2014-07-02 67 views
0

我連接表:OLD和NEW我的OUTER JOIN查詢的WHERE子句有什麼問題?

表:OLD

Employee_Name Status 
Ann    Y 
Bob    Y 
Carol 
Doug   Y 
Ellen 
Frank 

表:NEW

Employee_Name Status 
Ann    Y 
Bob 
Carol 
Ellen 
Frank 

我能得到我想要與此連接的輸出:

SELECT Old.Employee_Name AS [OldName] 
    ,New.Employee_Name AS [NewName] 
    ,Old.Status AS [OldStatus] 
    ,New.Status AS [NewStatus] 
FROM Old 
    FULL OUTER JOIN New ON Old.Employee_Name = New.Employee_Name 

這是:

OldName   NewName   OldStatus NewStatus 
Ann    Ann    Y   Y 
Bob    Bob    Y 
Carol   Carol  
Doug       Y 
Ellen   Ellen  
Frank   Frank 

現在我想爲查詢添加一個過濾器,以便它只保留新舊狀態不同的行。

如果我嘗試:

SELECT Old.Employee_Name AS [OldName] 
    ,New.Employee_Name AS [NewName] 
    ,Old.Status AS [OldStatus] 
    ,New.Status AS [NewStatus] 
FROM Old 
    FULL OUTER JOIN New ON Old.Employee_Name = New.Employee_Name 
WHERE Old.Status <> New.Status 

...它沒有提供正確的輸出。

在這個例子中,我認爲它會給輸出:

OldName   NewName   NewStatus OldStatus 
Bob    Bob    Y 

...並不能與道格返回行。

回答

0

如果在SQL語句中的任一運算符是null,它將爲該行返回空(無行)。例如,如果您執行a <> b其中a = 1b = null,它將始終返回沒有行,即使其ab不等效。

您需要查詢更改爲類似這樣:

WHERE COALESCE(Old.Status, '') <> COALESCE(New.Status, '') 
1

當你做外連接時,不匹配的行具有NULL值。這就是爲什麼你從where條款移動條件的on條款:

SELECT Old.Employee_Name AS [OldName], 
     New.Employee_Name AS [NewName], 
     Old.Status AS [OldStatus], 
     New.Status AS [NewStatus] 
FROM Old FULL OUTER JOIN 
    New 
    ON Old.Employee_Name = New.Employee_Name AND 
     Old.Status <> New.Status; 
+0

爲什麼會這樣有所作爲? 'ON'和'WHERE'使用相同的比較規則。您仍將null與非null進行比較,這會導致行不被返回。 – Codeman

+0

@ Pheonixblade9。 。 。你似乎不瞭解外連接如何工作。 'where'過濾結果。即使條件計算結果爲false,on也會保留每個表中的所有行。 –

相關問題