标签
SQL Server
Redis
MySQL
其它
Oracle
外部链接
SQL Server关于apply的两种形式cross apply 和 outer apply

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来实现

下面是示例:

用户表:

text_user.png

客户表:

text_cur.png

用户客户关联表:

text_relation.png

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.png

结果说明:从表中可以看出【曹操】有两个关联的客户【关羽】和【刘备】,但我们只要取他最新的客户的信息,使用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.png

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

扫一扫手机看
点击排行
订阅号
...