SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询


Posted in SQL Server onMay 25, 2022

概述

CROSS APPLY 与 OUTER APPLY 可以做到:
左表一条关联右表多条记录时,我需要控制右表的某一条或多条记录跟左表匹配的情况。

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

SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询

一、CROSS APPLY

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

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

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

结果:

SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询

二、OUTER APPLY

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

查询每个学生最近两次的考试成绩,没有参加考试的同学成绩补 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

结果:

SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询

三、应用场景

1.结合表值函数使用:

有一张表是这样的:

SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询

很简单的一张表,就一个字段num,我想把这个字段的int型数字分别转化成二进制八进制和十六进制的数值,有现成的进制转化的表值函数。

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

SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询

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

2.top子查询的用法:

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

SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询

我要看语文第一名,数学前两名,英语前三名的name,学科,分数,用cross apply实现方法如下:

SELECT b.* FROM (
    select Subject='Chiness',num=1 union all
    select 'Math',2 union all
    select 'English',3) a 
cross apply 
    (select top(a.num) * from Students where Subject=a.Subject ) b

SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询

到此这篇关于SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询的文章就介绍到这了。


Tags in this post...

SQL Server 相关文章推荐
2021-4-3课程——SQL Server查询【2】
Apr 05 SQL Server
SQL Server数据定义——模式与基本表操作
Apr 05 SQL Server
SQLServer2008提示评估期已过解决方案
Apr 12 SQL Server
SQL 窗口函数实现高效分页查询的案例分析
May 21 SQL Server
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
Jun 30 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
SQLServer RANK() 排名函数的使用
Mar 23 SQL Server
SQL Server表分区降低运维和维护成本
Apr 08 SQL Server
如何使用SQL Server语句创建表
Apr 12 SQL Server
SQL Server 中的事务介绍
May 20 SQL Server
SQL Server数据库备份和恢复数据库的全过程
Jun 14 SQL Server
SQL Server使用PIVOT与unPIVOT实现行列转换
May 25 #SQL Server
SQL SERVER中的流程控制语句
May 25 #SQL Server
SQL Server中搜索特定的对象
May 25 #SQL Server
SQL Server使用T-SQL语句批处理
May 20 #SQL Server
SQL Server 中的事务介绍
May 20 #SQL Server
SQL Server中锁的用法
May 20 #SQL Server
SQL Server中使用表变量和临时表
May 20 #SQL Server
You might like
Terran魔法科技
2020/03/14 星际争霸
PHP截取中文字符串的问题
2006/07/12 PHP
给初学PHP的5个入手程序
2006/11/23 PHP
PHP安全配置
2006/12/06 PHP
php中拷贝构造函数、赋值运算符重载
2012/07/25 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
php压缩文件夹最新版
2018/07/18 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
2018/07/31 PHP
javascript multibox 全选
2009/03/22 Javascript
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
js操作二进制数据方法
2018/03/03 Javascript
Nodejs把接收图片base64格式保存为文件存储到服务器上
2018/09/26 NodeJs
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
Python入门篇之函数
2014/10/20 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
出国签证在职证明
2014/09/20 职场文书
公司处罚决定书
2015/06/24 职场文书
车间班组长竞聘书
2015/09/15 职场文书
使用pytorch实现线性回归
2021/04/11 Python