2014-07-02 72 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也会保留每个表中的所有行。 –

相关问题