SQL Server 中的 CROSS APPLY 类似于 INNER JOIN,但 CROSS APPLY一般用于连接带参表值函数和带参数子查询;而 OUTER APPLY 则类似于 LEFT JOIN,也是用于连接带参表值函数和带参数子查询 。
以下示例假定数据库中存在以下表和表值函数:
对象 | 列名 |
---|---|
Departments | DeptID、DivisionID、DeptName、DeptMgrID |
EmpMgr | MgrID、EmpID |
Employees | EmpID、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);
如果您希望查询为那些没有员工的部门生成行(这将为 EmpID
、EmpLastName
和 EmpSalary
列生成 Null 值),请改用 OUTER APPLY
。
SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalary
FROM Departments d
OUTER APPLY dbo.GetReports(d.DeptMgrID);