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 08 SQL Server
SqlServer 垂直分表(减少程序改动)
Apr 16 SQL Server
SQL Server2019数据库之简单子查询的具有方法
Apr 27 SQL Server
在 SQL 语句中处理 NULL 值的方法
Jun 07 SQL Server
SqlServer数据库远程连接案例教程
Jul 15 SQL Server
sql通过日期判断年龄函数的示例代码
Jul 16 SQL Server
SQLServer中exists和except用法介绍
Dec 04 SQL Server
SQL Server中常用截取字符串函数介绍
Mar 16 SQL Server
sql server偶发出现死锁的解决方法
Apr 10 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
SQL Server中的游标介绍
May 20 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
2016/05/11 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
AngularJS集合数据遍历显示的实例
2017/12/27 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
python爬取m3u8连接的视频
2018/02/28 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
详解python多线程之间的同步(一)
2019/04/03 Python
linux下python中文乱码解决方案详解
2019/08/28 Python
查看keras的默认backend实现方式
2020/06/19 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
广州品高软件.net笔面试题目
2012/04/18 面试题
十佳护士获奖感言
2014/02/18 职场文书
给学校的建议书范文
2014/05/15 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
Go语言特点及基本数据类型使用详解
2022/03/21 Golang