日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求。比如,左表一条关联右表多条记录时,我需要控制右表的某一条或多条记录跟左表匹配。貌似,INNER JOIN 或 LEFT OUTER JOIN 不能很好完成。但是 CROSS APPLY 与 OUTER APPLY 可以

有两张表:Student(学生表)和 Score(成绩表),数据如下

1)查询每个学生最近两次的考试成绩

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

CROSS APPLY(

SELECT TOP 2 * FROM Score AS T

WHERE T1.StudentNo = T.StudentNo

ORDER BY T.ExamDate DESC

) AS T2

2)  查询每个学生最近两次的考试成绩,没有参加考试的同学成绩补 null

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

OUTER APPLY(

SELECT TOP 2 * FROM Score AS T

WHERE T1.StudentNo = T.StudentNo

ORDER BY T.ExamDate DESC

) AS T2

总结

1.   理解 CROSS APPLY 与 OUTER APPLY(个人理解)

1)   CROSS APPLY 的意思是“交叉应用”,在查询时首先查询左表,然后右表的每一条记录跟左表的当前记录进行匹配。匹配成功则将左表与右表的记录合并为一条记录输出;匹配失败则抛弃左表与右表的记录。(与 INNER JOIN 类似)

2)   OUTER APPLY 的意思是“外部应用”,与 CROSS APPLY 的原理一致,只是在匹配失败时,左表与右表也将合并为一条记录输出,不过右表的输出字段为 null。(与 LEFT OUTER JOIN 类似)

2.   CROSS APPLY 与 INNER JOIN 的区别

1)   CROSS APPLY 可以根据当前左表的当前记录去查询右表,但是 INNER JOIN 不可以,INNER JOIN 是根据左表的当前记录匹配右表整个结果集。

2)   两者都是匹配成功才输出。

3.   OUTER APPLY 与 LEFT OUTER JOIN 的区别

1)   它们和(CROSS APPLY 与 INNER JOIN)类似。

2)   只是两者都是匹配失败也会输出。

4.   使用场景:

1)   一个商品有多张图片,但是只想取最近的一张图片跟商品匹配。

5.   总结一句话:右表可以是有条件的跟左表的记录匹配,而条件的值可以来至于左表。

SQLSERVER CROSS APPLY 与 OUTER APPLY 的应用的更多相关文章

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

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

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

    https://blog.csdn.net/wikey_zhang/article/details/77480118 先简单了解下cross apply的语法以及会产生什么样的结果集吧! 示例表: S ...

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

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

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

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

  5. SQL 关于apply的两种形式cross apply 和 outer apply

    SQL 关于apply的两种形式cross apply 和 outer apply 例子: CREATE TABLE [dbo].[Customers]( ) COLLATE Chinese_PRC_ ...

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

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

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

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

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

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

  9. CROSS APPLY和 OUTER APPLY

    背景 好强大的sql,但是我好想真极少用过这两个函数,再次强调,不要总是用sql解决问题.让人欢喜让人悲的sql. --  cross applyselect *  from TABLE_1 T1cr ...

随机推荐

  1. PyQt4 ShowHMDB show sqlite3 with QTableWidget summary

    PyQt4 ShowHMDB show sqlite3 with QTableWidget summary Source Code: https://github.com/zengjfgit/Pyth ...

  2. 【spring源码学习】Spring @PostConstruct和@PreDestroy实例

    在Spring中,既可以实现InitializingBean和DisposableBean接口或在bean配置文件中指定 init-method 和 destroy-method 在初始化和销毁回调函 ...

  3. 安装node

    vuejs:通过npm安装vue框架(印象深刻的问题出在了npm上) 以下所有事我自己在windows系统下遇到的问题 一.安装nodejs node下载地址https://nodejs.org/en ...

  4. logstash使用分享

    1.logstash时间处理函数 当业务场景需要自有的time字段覆盖@timestamp字段的情况下 需要使用 date { match => ["time", " ...

  5. Tomcat服务器端口的配置

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  6. Python 迭代对象、迭代器、生成器

    原文出处: liuzhijun 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文 ...

  7. Makefile编写 二

    变量 1. Makefile中变量和函数的展开(除规则命令行中的变量和函数以外),是在make读取makefile文件时进行的,包括“define”定义的变量. 2. 变量可以用来代表一个文件名列表. ...

  8. 黄聪:C#使用能够foreach对hashtable、List遍历时“集合已修改;可能无法执行枚举操作。”错误

    解决办法:使用for循环,而不是foreach循环 例如: ArrayList akeys=new ArrayList(_transmit_tb.Keys); ;p> -;p--) { _tra ...

  9. Log4j(3)--rootLogger根配置和appender输出类型配置

    参考博客:http://blog.java1234.com/blog/articles/270.html 一.rootLogger根配置: Log4j 根配置语法 log4j.rootLogger = ...

  10. mac电脑 pip安装包后 撞到了系统python里面的解决方法

    /usr/local/Cellar/python@2/2.7.14_3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-pack ...