SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

不操千曲而后晓声,观千剑而后识器。这篇文章主要讲述SQLServer连接查询之Cross Apply和Outer Apply的区别及用法相关的知识,希望能为你提供帮助。
https://blog.csdn.net/wikey_zhang/article/details/77480118 
先简单了解下cross apply的语法以及会产生什么样的结果集吧!
示例表:

SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

文章图片
SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

文章图片

SELECT * FROM tableA CROSS APPLY tableB

两张表直接连接,不需要任何的关联条件,产生的结果就是这两张表的笛卡儿集,在这里和上一篇帖子讲的cross join交叉连接的结果集是一样的
SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

文章图片

相当于:select * from tableA,tableB
与之对应的还有Out Apply,下面讲解一下Cross Apply 和 Outer Apply 的区别:
首先是Cross Apply:
 
SELECT * FROM tableA a CROSS APPLY (select * from tableB where id=a.id) b

SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

文章图片

这个结果集和 select * from tableA a inner join tableB b on a.id=b.id  一模一样,这就相当于inner join 的连接查询嘛!当然,你也可以这样写:
  1.   SELECT * FROM tableA a CROSS APPLY tableB b
  2.   WHERE a.id=b.id
结果集一模一样无差别!
其次是Outer Apply:
SELECT * FROM tableA a OUTER APPLY (select * from tableB where id=a.id) b

SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

文章图片

发现了吧!这个结果集和left join连接查询产生的结果集一模一样~
同时,发现Cross Apply 和 Cross JOin 的区别了没?
Cross Apply 可以在关联表子查询中用前一个关联表的字段的值,而Cross Join 却不行,比如这样写:SELECT * FROM tableA a CROSS JOIN (select * from tableB where id=a.id) b,语法上就不能通过!
因此Cross Join 很鸡肋,既然有Cross Apply了,那么Cross Join几乎毫无存在的价值~
【SQLServer连接查询之Cross Apply和Outer Apply的区别及用法】针对这一点,下面列举一些Cross Apply特有的用法:
1.结合表值函数使用:
有一张表是这样的:
SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

文章图片

很简单的一张表,就一个字段num,我想把这个字段的int型数字分别转化成二进制八进制和十六进制的数值,有现成的进制转化的表值函数,我前面关于函数的讲解有写过这个函数的例子:点击打开链接
SELECT * FROM #T a CROSS APPLY [dbo].[F_TConversion](a.num)

SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

文章图片

实现这个结果集用CROSS APPLY,只要一句就能实现,如果换成其他的方法的话应该没这么简单哈~
总结一下:
如果查询结果集需要用到表值函数对某个字段的值进行处理的话,请使用CROSS APPLY~
2.top子查询的用法:
有一张学生表,分别name,学科,分数 这三个字段,如下:
SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

文章图片

我要看语文第一名,数学前两名,英语前三名的name,学科,分数,用cross apply实现方法如下:
 
  1.   SELECT b.* FROM (
  2.   select Subject=‘Chiness‘,num=1 union all
  3.   select ‘Math‘,2 union all
  4.   select ‘English‘,3
  5.   )a cross apply (select top(a.num) * from Students where Subject=a.Subject )b
SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

文章图片
 

    推荐阅读