sql脚本与嵌入或分隔的where子句有什么不同?

时间:2016-10-30 18:40:20

标签: sql-server tsql where

我想要一份报告,告诉我HumanResources.EmployeeSales.OrderHeader无关。我必须使用RIGHT/LEFT OUTER JOIN但是在过滤中我们有两个选择(在连接中使用where语句或在experssion中使用where语句)。

我使用了这段代码:

SELECT 
    E.EmployeeID,
    E.FirstName,
    E.LastName,
    O.OrderHeaderID,
    O.OrderDate
FROM 
    Sales.OrderHeader O
RIGHT OUTER JOIN 
    HumanResources.Employee E ON O.EmployeeID = E.EmployeeID 
    AND O.OrderHeaderID IS NULL

SELECT 
    E.EmployeeID,
    E.FirstName,
    E.LastName,
    O.OrderHeaderID,
    O.OrderDate
FROM 
    Sales.OrderHeader O
RIGHT OUTER JOIN 
    HumanResources.Employee E ON O.EmployeeID = E.EmployeeID
WHERE 
    O.OrderHeaderID IS NULL

我预计会向我显示相同的结果,但显示的是第一个代码:

EmployeeID|  FirstName|   LastName| OrderHeaderID
-----------+----------+------------+-----------
     1     |    نوری    |  محمد    |    NULL
     2     |    فربدی    |   حسن   |    NULL
     3     |    صباغی    |  محمد   |    NULL
     4     |    مرادی    |  احمد   |    NULL
     10    |    احمدی    |   حسن   |    NULL
     11    |   بیرونی    |  ساسان  |    NULL

和第二个代码显示此结果(正确结果):

EmployeeID|  FirstName|   LastName| OrderHeaderID
-----------+----------+------------+-----------
     10    |    احمدی    |   حسن   |    NULL
     11    |   بیرونی    |  ساسان  |    NULL

我没有发现这些结果背后的原因。

2 个答案:

答案 0 :(得分:0)

您的代码不同。第二次做你所描述的。尝试基于employeId加入(当记录在具有相同的EmployeeID时是关系)然后仅过滤右侧为空(无关系)的结果。

第一个代码尝试基于相等的EmployeeID和O.OrderHeaderID IS NULL进行连接。所以你说这种关系就是记录具有相同的EmployeeID,而OrderHeaderID在表中是空的。所以这是不同的关系。

答案 1 :(得分:0)

首先,我认为LEFT JOIN对大多数人来说更容易理解。这意味着"保留 first 表中的所有行,以及来自第二个"的匹配值。我承认,对于母语从右到左阅读的人来说,这可能不太自然。

其次,外连接中的ON子句非常容易理解。它表示要保持所有行,即使没有匹配。所以,你的条件是O.OrderHeaderID IS NULL。无论评估方式如何,所有行都保存在第二个表(Employee)中。

您知道正确的解决方案是将条件放在WHERE子句中,因此无需重复此操作。