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
SqlServer数据库远程连接案例教程
Jul 15 SQL Server
SQL写法--行行比较
Aug 23 SQL Server
SQL SERVER存储过程用法详解
Feb 24 SQL Server
SQL SERVER触发器详解
Feb 24 SQL Server
SQL Server查询某个字段在哪些表中存在
Mar 03 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
SQL Server内存机制浅探
Apr 06 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
SQL SERVER中的流程控制语句
May 25 SQL Server
SQL Server中的逻辑函数介绍
May 25 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下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
PHP删除数组中的特定元素的代码
2012/06/28 PHP
基于empty函数的判断详解
2013/06/17 PHP
在Javascript中为String对象添加trim,ltrim,rtrim方法
2006/09/22 Javascript
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
JS函数本身的作用域实例分析
2020/03/16 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
python调用java的Webservice示例
2014/03/10 Python
python3序列化与反序列化用法实例
2015/05/26 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
PyQt5实现简单的计算器
2020/05/30 Python
详解python tkinter 图片插入问题
2020/09/03 Python
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
大学生收银员求职信分享
2014/01/02 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
课前三分钟演讲稿
2014/04/24 职场文书
应急处置方案
2014/06/16 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
导游词之云南丽江古城
2019/09/17 职场文书
JAVA API 实用类 String详解
2021/10/05 Java/Android
Linux下搭建SFTP服务器的命令详解
2022/06/25 Servers