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

SQLServer连接查询之Cross Apply和Outer Apply的区别及用法的更多相关文章

  1. SQL Server连接查询之Cross Apply和Outer Apply的区别及用法(转载)

    先简单了解下cross apply的语法以及会产生什么样的结果集吧!示例表: SELECT * FROM tableA CROSS APPLY tableB 两张表直接连接,不需要任何的关联条件,产生 ...

  2. SqlSever 使用 CROSS APPLY 与 OUTER APPLY 连接查询

    前言 日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某一条或 ...

  3. 使用 CROSS APPLY 与 OUTER APPLY 连接查询

    Ø  前言 日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某 ...

  4. SQL SERVER使用 CROSS APPLY 与 OUTER APPLY 连接查询

    概述 CROSS APPLY 与 OUTER APPLY 可以做到:      左表一条关联右表多条记录时,我需要控制右表的某一条或多条记录跟左表匹配的情况. 有两张表:Student(学生表)和 S ...

  5. SQLSERVER CROSS APPLY 与 OUTER APPLY 的应用

    日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某一条或多条记 ...

  6. SQLServer count函数、cross apply和outer apply、

    1.COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)2.COUNT(*) 函数返回表中的记录数 select *   from TABLE_1 T1 outer ap ...

  7. SQL 关于apply的两种形式cross apply 和 outer apply(转)

    转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...

  8. SQL关于apply的两种形式cross apply和outer apply(转载)

    SQL 关于apply的两种形式cross apply 和 outer apply   apply有两种形式: cross apply 和 outer apply   先看看语法:   <lef ...

  9. SQL Server 关于CROSS APPLY 和 OUTER APPLY应用

    先看看语法: <left_table_expression>  {cross|outer} apply<right_table_expression> 再让我们了解一下appl ...

随机推荐

  1. Swing绘图API

    ----------------siwuxie095                             工程名:TestSwingPaintAPI 包名:com.siwuxie095.swing ...

  2. 使用ServerSocket建立聊天服务器(二)

    -------------siwuxie095                         工程名:TestMyServerSocket 包名:com.siwuxie095.socket 类名:M ...

  3. 百度Apollo解析——3.common

    1.略读 该目录下主要提供了各个模块公用的函数和class以及一些数学API还有公共的宏定义. 在Apollo 1.0中,common是整个框架的基础.configs是配置文件加载.adapters是 ...

  4. 报错:空指针java.lang.NullPointerException 原因 Action层 private UserService userservice 上未加@Autowire注解

    java.lang.NullPointerException at com.itheima.test.Test2.fun1(Test2.java:18) at sun.reflect.NativeMe ...

  5. 提取a标签的链接文字

    在seg上看到一个问题 <a href="http://www.abc.com/thread-4131866-1-1.html" class="s xst" ...

  6. java中下面这些引入都代表什么意思啊?

    import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; import java.uti ...

  7. SPOJ GSS7 - Can you answer these queries VII

    板的不能再板,链剖+线段树或者是LCT随便维护. 感觉唯一要注意的是跳链的时候要对$x$向上跳和$y$向上跳的情况分开讨论,而不能直接$swap$,因为只有两段接触的端点才能相互合并,而且每一次向上跳 ...

  8. STL源码剖析--迭代器(转)

    一.为什么需要traits编程技术 前面说了很多关于traits的光荣事迹,但是却一直没有介绍traits究竟是个什么东西,究竟是用来干什么的?traits在英文解释中就是特性,下面将会引入trait ...

  9. java获取Excel的导入

    先准备好这2个架包 import java.io.*; import org.apache.commons.io.FileUtils; import org.apache.poi.hssf.userm ...

  10. 常用Git命令清单

    我现在工作几乎每天都使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用 ...