我想要一份报告,告诉我HumanResources.Employee
与Sales.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
我没有发现这些结果背后的原因。
答案 0 :(得分:0)
您的代码不同。第二次做你所描述的。尝试基于employeId加入(当记录在具有相同的EmployeeID时是关系)然后仅过滤右侧为空(无关系)的结果。
第一个代码尝试基于相等的EmployeeID和O.OrderHeaderID IS NULL进行连接。所以你说这种关系就是记录具有相同的EmployeeID,而OrderHeaderID在表中是空的。所以这是不同的关系。
答案 1 :(得分:0)
首先,我认为LEFT JOIN
对大多数人来说更容易理解。这意味着"保留 first 表中的所有行,以及来自第二个"的匹配值。我承认,对于母语从右到左阅读的人来说,这可能不太自然。
其次,外连接中的ON
子句非常容易理解。它表示要保持所有行,即使没有匹配。所以,你的条件是O.OrderHeaderID IS NULL
。无论评估方式如何,所有行都保存在第二个表(Employee
)中。
您知道正确的解决方案是将条件放在WHERE
子句中,因此无需重复此操作。