我在SQL Server中阅读了有关CROSS APPLY
和OUTER APPLY
的文章。以下表格用于说明两者。OUTER适用于子查询
Employee表:
EmployeeID FirstName LastName DepartmentID
1 Orlando Gee 1
2 Keith Harris 2
3 Donna Carreras 3
4 Janet Gates 3
系表:
DepartmentID Name
1 Engineering
2 Administration
3 Sales
4 Marketing
5 Finance
我了解,OUTER APPLY
类似于LEFT OUTER JOIN.
但是,当我申请如下表之间OUTER APPLY
,
select * from Department e
outer apply
Employee d
where d.DepartmentID = e.DepartmentID
我得到低于结果(S AME如INNER JOIN
结果)
DepartmentID Name EmployeeID FirstName LastName DepartmentID
1 Engineering 1 Orlando Gee 1
2 Administration 2 Keith Harris 2
3 Sales 3 Donna Carreras 3
3 Sales 4 Janet Gates 3
当我表之间施加OUTER APPLY
如下面(与right table
为子查询)。
select * from Department e
outer apply
(
select * from
Employee d
where d.DepartmentID = e.DepartmentID
)a
我得到以下结果(同LEFT OUTER JOIN
结果)
DepartmentID Name EmployeeID FirstName LastName DepartmentID
1 Engineering 1 Orlando Gee 1
2 Administration 2 Keith Harris 2
3 Sales 3 Donna Carreras 3
3 Sales 4 Janet Gates 3
4 Marketing NULL NULL NULL NULL
5 Finance NULL NULL NULL NULL
有人可以解释为什么这两个查询了不同outputs
?
感谢您的解释,但我也有第二个查询中的where子句..是否在子查询中的where子句的行为不同? – bmsqldev
由于where子句位于子查询中,因此它首先被应用,并且不会影响从'Department'检索的行,因此而不是指示“获取部门和员工的所有组合,然后只留下部门匹配的那些”的指令,你实际上是在说“给我所有部门的记录,并为每个部门获取所有匹配的员工记录”。 – GarethD