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 相关文章推荐
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
mybatis调用sqlserver存储过程返回结果集的方法
May 08 SQL Server
SQL 窗口函数实现高效分页查询的案例分析
May 21 SQL Server
sql中mod()函数取余数的用法
May 29 SQL Server
sql字段解析器的实现示例
Jun 23 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
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
SQL Server使用T-SQL语句批处理
May 20 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
PHP4.04简明安装
2006/10/09 PHP
第十四节--命名空间
2006/11/16 PHP
PHP基础知识回顾
2012/08/16 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
PHP采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
JavaScript重载函数实例剖析
2016/05/13 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
js实现文字无缝向上滚动
2017/02/16 Javascript
js判断手机系统是android还是ios
2017/03/07 Javascript
深入理解vue Render函数
2017/07/19 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
深入理解javascript中的this
2021/02/08 Javascript
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
仓管员岗位职责范文
2013/11/08 职场文书
教师求职推荐信范文
2013/11/20 职场文书
统计岗位职责
2014/02/21 职场文书
就业协议书怎么填
2014/09/15 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python