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 相关文章推荐
【HBU】数据库第四周 单表查询
Apr 05 SQL Server
SQL Server连接查询的实用教程
Apr 07 SQL Server
SQLServer2019 数据库环境搭建与使用的实现
Apr 08 SQL Server
sql中mod()函数取余数的用法
May 29 SQL Server
SqlServer数据库远程连接案例教程
Jul 15 SQL Server
Spark SQL 2.4.8 操作 Dataframe的两种方式
Oct 16 SQL Server
SQL SERVER触发器详解
Feb 24 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
MSSQL基本语法操作
Apr 11 SQL Server
SQL SERVER中的流程控制语句
May 25 SQL Server
SqlServer常用函数及时间处理小结
May 08 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
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
PHP使用Nginx实现反向代理
2017/09/20 PHP
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
理解Python垃圾回收机制
2016/02/12 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
Python的UTC时间转换讲解
2019/02/26 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
python 三元运算符使用解析
2019/09/16 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
python判断元素是否存在的实例方法
2020/09/24 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
初级Java程序员面试题
2016/03/03 面试题
体育教师工作总结的自我评价
2013/10/10 职场文书
大学生专科学习生活的自我评价
2013/12/07 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
九年级数学教学反思
2016/02/17 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL
html css3不拉伸图片显示效果
2021/06/07 HTML / CSS