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 相关文章推荐
SQL Server 数据库实验课第五周——常用查询条件
Apr 05 SQL Server
SQLServer2008提示评估期已过解决方案
Apr 12 SQL Server
SQLServer中JSON文档型数据的查询问题解决
Jun 27 SQL Server
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
Jun 30 SQL Server
SQLServer中exists和except用法介绍
Dec 04 SQL Server
SQL SERVER实现连接与合并查询
Feb 24 SQL Server
SQL SERVER存储过程用法详解
Feb 24 SQL Server
使用SQL实现车流量的计算的示例代码
Feb 28 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
SQL SERVER中的流程控制语句
May 25 SQL Server
SQL Server使用PIVOT与unPIVOT实现行列转换
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实现的简单压缩英文字符串的代码
2008/04/24 PHP
PHP中nowdoc和heredoc使用需要注意的一点
2014/03/21 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
BootStrap中
2016/12/10 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
python基础教程之对象和类的实际运用
2014/08/29 Python
Python编写生成验证码的脚本的教程
2015/05/04 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
django教程如何自学
2020/07/31 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
摄影实习自我鉴定
2013/09/20 职场文书
工商管理毕业生推荐信
2013/12/24 职场文书
认识深刻的检讨书
2014/02/16 职场文书
融资租赁计划书
2014/04/29 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
详细介绍python类及类的用法
2021/05/31 Python
python神经网络 使用Keras构建RNN训练
2022/05/04 Python