CROSS APPLY 是 SQL Server 中的一个操作符,它用于将表值函数或表值表达式应用到外部查询的每一行,并返回结果集。它类似于 JOIN 操作,但它对每一行都执行右侧表达式,并只返回与外部查询匹配的行。
在 CROSS APPLY 的上下文中,左侧的表(或表达式)被称为外部输入,而右侧的表值函数或表达式被称为内部输入。CROSS APPLY 会对外部输入的每一行执行内部输入,并只返回那些内部输入返回结果的行。
这里有几个关键点:
一对一关系:CROSS APPLY 会对外部输入的每一行执行内部输入,这意味着它建立的是一对一的关系。
过滤作用:如果内部输入对于某行没有返回结果,那么这一行将不会出现在最终的结果集中。这与 OUTER APPLY 不同,后者即使内部输入没有返回结果,也会返回外部输入的行,并将内部输入的结果设置为 NULL。
性能:由于 CROSS APPLY 会对每一行执行内部操作,它可能会对性能产生影响,特别是当内部操作复杂或者外部输入的数据量很大时。
使用场景:CROSS APPLY 常用于需要对每一行数据进行某种转换或计算的场景,例如,将字符串拆分为多行,或者对每一行的数据执行复杂的函数调用。
下面是一个简单的例子,说明 CROSS APPLY 的用法:
SELECT
e.EmployeeID,
e.Name,
d.DivisionName FROM
Employees e
CROSS APPLY dbo.GetDivisionName(e.DivisionID) d
在这个例子中,Employees 表有一个 DivisionID 列,我们想要获取每个员工对应的部门名称。dbo.GetDivisionName 是一个表值函数,它接受 DivisionID 作为参数,并返回部门名称。CROSS APPLY 会对 Employees 表的每一行执行这个函数,并返回结果。
如果 dbo.GetDivisionName 函数对于某个 DivisionID 没有找到对应的部门名称,那么这一行就不会出现在最终的结果集中。如果你想要即使没有找到部门名称也返回员工信息,可以使用 OUTER APPLY 替代 CROSS APPLY。