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 22 SQL Server
sql查询结果列拼接成逗号分隔的字符串方法
May 25 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
SQL Server内存机制浅探
Apr 06 SQL Server
SQL Server的存储过程与触发器以及系统函数和自定义函数
Apr 10 SQL Server
如何使用SQL Server语句创建表
Apr 12 SQL Server
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
Apr 22 SQL Server
SQL Server 忘记密码以及重新添加新账号
Apr 26 SQL Server
SQL Server #{}可以防止SQL注入
May 11 SQL Server
SQL Server 中的事务介绍
May 20 SQL Server
在SQL Server中使用 Try Catch 处理异常的示例详解
Jul 15 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 Ajax实现页面无刷新发表评论
2007/01/02 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
PHP面向对象法则
2012/02/23 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
javascript innerText和innerHtml应用
2010/01/28 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
JavaScript变量作用域及内存问题实例分析
2019/06/10 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
Python入门篇之面向对象
2014/10/20 Python
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
CAT鞋英国官网:坚固耐用的靴子和鞋
2016/10/21 全球购物
土地转让协议书
2014/04/15 职场文书
经管应届生求职信范文
2014/05/18 职场文书
物理学专业自荐信
2014/06/11 职场文书
幼儿园秋季开学寄语
2014/08/02 职场文书
毕业论文答辩稿范文
2015/06/23 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书
Python 语言实现六大查找算法
2021/06/30 Python