apply有两种形式: cross apply 和 outer apply
先看看语法:
<left_table_expression> {cross|outer} apply <right_table_expression>
使用apply就像是先计算左输出,然后为左输入中的每一行计算一次右输出。
cross apply和outer apply的区别:
cross apply 需要左右两个表达式都有输出才显示(类似于Inner Join)
outer apply 可以允许右边使用NULL来填充(类似于Left join)
运用场景:当左边表达式和右边表达式是一对多的关系时,可以使用apply语法先过滤出右表的数据,再链接输出结果,比如,右表是可以多次审核的审核记录,这时我们要去取最新审核记录来显示就可以使用apply来实现
下面是示例:
用户表:

客户表:

用户客户关联表:

CROSS APPLY示例:
SELECT per.Name 用户, cur.Name 客户, cur.Id 客户编号
FROM Test.dbo.[User] per
CROSS APPLY (SELECT TOP 1
cur.Name, cur.Id
FROM Test.dbo.UserCustomerRelation rela
INNER JOIN Test.dbo.Customer cur ON cur.Id = rela.CustomerId
WHERE per.Id = rela.UserId
ORDER BY cur.Id DESC) cur结果:

结果说明:从表中可以看出【曹操】有两个关联的客户【关羽】和【刘备】,但我们只要取他最新的客户的信息,使用CROSS APPLY可以做到,右表达式查询出最新的客户然后与左表达式链接输出结果,top 1 取一条数据,然后用 order by 排序。
OUTER APPLY示例:
SELECT per.Name 用户, cur.Name 客户, cur.Id 客户编号
FROM Test.dbo.[User] per
OUTER APPLY (SELECT TOP 1
cur.Name, cur.Id
FROM Test.dbo.UserCustomerRelation rela
INNER JOIN Test.dbo.Customer cur ON cur.Id = rela.CustomerId
WHERE per.Id = rela.UserId
ORDER BY cur.Id DESC) cur结果:

结果说明:从输出结果可以看出,OUTER APPLY比CROSS APPLY多输出了几条记录,并且是用NULL填充的,结果与LEFT JOIN 类似。这就是两个使用的区别