zoukankan      html  css  js  c++  java
  • SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

    https://blog.csdn.net/wikey_zhang/article/details/77480118

    先简单了解下cross apply的语法以及会产生什么样的结果集吧!

    示例表:

    SELECT * FROM tableA CROSS APPLY tableB
    

    两张表直接连接,不需要任何的关联条件,产生的结果就是这两张表的笛卡儿集,在这里和上一篇帖子讲的cross join交叉连接的结果集是一样的

    相当于: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
    

    这个结果集和 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
    


    发现了吧!这个结果集和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几乎毫无存在的价值~

    针对这一点,下面列举一些Cross Apply特有的用法:

    1.结合表值函数使用:

    有一张表是这样的:

    很简单的一张表,就一个字段num,我想把这个字段的int型数字分别转化成二进制八进制和十六进制的数值,有现成的进制转化的表值函数,我前面关于函数的讲解有写过这个函数的例子:点击打开链接

    SELECT * FROM #T a CROSS APPLY [dbo].[F_TConversion](a.num)
    

    实现这个结果集用CROSS APPLY,只要一句就能实现,如果换成其他的方法的话应该没这么简单哈~

    总结一下:

    如果查询结果集需要用到表值函数对某个字段的值进行处理的话,请使用CROSS APPLY~

    2.top子查询的用法:

    有一张学生表,分别name,学科,分数 这三个字段,如下:

    我要看语文第一名,数学前两名,英语前三名的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
  • 相关阅读:
    hadoop优点和缺点
    HDFS的基本shell操作,hadoop fs操作命令
    HDFS的java操作方式
    HDFS的体系结构和操作
    windows主机无法访问服务器
    用公共key实现无密码ssh
    hadoop2的伪分布部署
    lsof/fuser卸载挂载文件
    编译Apache Hadoop2.2.0源代码
    三十分钟掌握STL
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/10495891.html
Copyright © 2011-2022 走看看