SQL Server 的 CROSS APPLY 和 OUTER APPLY 的应用场景

SQL Server 中的 CROSS APPLY 类似于 INNER JOIN,但 CROSS APPLY一般用于连接带参表值函数和带参数子查询;而 OUTER APPLY 则类似于 LEFT JOIN,也是用于连接带参表值函数和带参数子查询 。

以下示例假定数据库中存在以下表和表值函数:

对象列名
DepartmentsDeptID、DivisionID、DeptName、DeptMgrID
EmpMgrMgrID、EmpID
EmployeesEmpID、EmpLastName、EmpFirstName、EmpSalary
GetReports(MgrID)EmpID、EmpLastName、EmpSalary

GetReports 表值函数返回直接或间接报告给指定 MgrID 的所有员工的列表。

该示例使用 CROSS APPLY 返回所有部门和部门中的所有员工。 如果某个部门没有任何员工,则将不返回该部门的任何行。

SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalary  
FROM Departments d    
CROSS APPLY dbo.GetReports(d.DeptMgrID);

如果您希望查询为那些没有员工的部门生成行(这将为 EmpIDEmpLastName 和 EmpSalary 列生成 Null 值),请改用 OUTER APPLY

SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalary  
FROM Departments d   
OUTER APPLY dbo.GetReports(d.DeptMgrID);