SQLSERVER CROSS APPLY 与 OUTER APPLY 的应用
日常开发中遇到多表查询时,首先会想到 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 的应用的更多相关文章
- SQLServer count函数、cross apply和outer apply、
1.COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)2.COUNT(*) 函数返回表中的记录数 select * from TABLE_1 T1 outer ap ...
- SQLServer连接查询之Cross Apply和Outer Apply的区别及用法
https://blog.csdn.net/wikey_zhang/article/details/77480118 先简单了解下cross apply的语法以及会产生什么样的结果集吧! 示例表: S ...
- SQL Server连接查询之Cross Apply和Outer Apply的区别及用法(转载)
先简单了解下cross apply的语法以及会产生什么样的结果集吧!示例表: SELECT * FROM tableA CROSS APPLY tableB 两张表直接连接,不需要任何的关联条件,产生 ...
- SQL 关于apply的两种形式cross apply 和 outer apply(转)
转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...
- SQL 关于apply的两种形式cross apply 和 outer apply
SQL 关于apply的两种形式cross apply 和 outer apply 例子: CREATE TABLE [dbo].[Customers]( ) COLLATE Chinese_PRC_ ...
- SQL关于apply的两种形式cross apply和outer apply(转载)
SQL 关于apply的两种形式cross apply 和 outer apply apply有两种形式: cross apply 和 outer apply 先看看语法: <lef ...
- SqlSever 使用 CROSS APPLY 与 OUTER APPLY 连接查询
前言 日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某一条或 ...
- 使用 CROSS APPLY 与 OUTER APPLY 连接查询
Ø 前言 日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某 ...
- CROSS APPLY和 OUTER APPLY
背景 好强大的sql,但是我好想真极少用过这两个函数,再次强调,不要总是用sql解决问题.让人欢喜让人悲的sql. -- cross applyselect * from TABLE_1 T1cr ...
随机推荐
- BusyBox ifup udhcpc后台运行
/********************************************************************** * BusyBox ifup udhcpc后台运行 * ...
- ZetCode PyQt4 tutorial widgets I
#!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial In this example, ...
- kudu 虚拟机环境使用
安装 curl -s https://raw.githubusercontent.com/cloudera/kudu-examples/master/demo-vm-setup/bootstrap ...
- Yarn import now uses package-lock.json
转发自: https://yarnpkg.com/blog/2018/06/04/yarn-import-package-lock/?utm_source=tuicool&utm_medium ...
- Swift学习——A Swift Tour 协议和扩展
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhenyu5211314/article/details/28854395 Protocols an ...
- hdu1066
求N!的非零末尾位(吉大ACM模板) #include <stdio.h> #include <string.h> #define MAXN 10000 int lastdig ...
- jmap打dump异常
背景 用jmap打dump文件经常遇到如下异常,打不出来,哥今天告拆大家一个终极解决方法,嘘,不要告拆别人.. Attaching to core -F from executable 421442, ...
- VS2013编译64位OpenSSL(附32位)
安装ActivePerl 这个没什么好说的,直接运行msi即可. 编译OpenSSL 1.使用Visual Studio Tool中的“VS2013 x64 本机工具命令提示”来打开控制台:也可以打开 ...
- [原]Android 开发第一步
使用 android-studio 开发 写文章时的最新 Android-Studio 程序下载:https://dl.google.com/dl/android/studio/ide-zips/3. ...
- 30_java之DButils工具类
01DButils工具类的介绍个三个核心类 * A: DButils工具类的介绍个三个核心类 * a: 概述 * DBUtils是java编程中的数据库操作实用工具,小巧简单实用. * DBUtils ...