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
SQL Server中交叉联接的用法详解
Apr 22 SQL Server
SQL 窗口函数实现高效分页查询的案例分析
May 21 SQL Server
Windows环境下实现批量执行Sql文件
Oct 05 SQL Server
Sql Server之数据类型详解
Feb 28 SQL Server
SQL Server查询某个字段在哪些表中存在
Mar 03 SQL Server
SQL Server的存储过程与触发器以及系统函数和自定义函数
Apr 10 SQL Server
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
Apr 22 SQL Server
SQL Server中搜索特定的对象
May 25 SQL Server
SQL解决未能删除约束问题drop constraint
May 30 SQL Server
SQL中的连接查询详解
Jun 21 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
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
2014/05/09 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
2014/12/22 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
2015/02/15 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
javascript实现连续赋值
2015/08/10 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
vue  directive定义全局和局部指令及指令简写
2018/11/20 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
将python代码和注释分离的方法
2018/04/21 Python
python 读取DICOM头文件的实例
2018/05/07 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
python 装饰器的基本使用
2021/01/13 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
自我鉴定范文300字
2013/10/01 职场文书
yy生日主持词
2014/03/20 职场文书
119消防日活动总结
2014/08/29 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书
Pandas自定义选项option设置
2021/07/25 Python