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基本使用和简单的CRUD操作
Apr 05 SQL Server
SQL Server中交叉联接的用法详解
Apr 22 SQL Server
如何有效防止sql注入的方法
May 25 SQL Server
Windows环境下实现批量执行Sql文件
Oct 05 SQL Server
Spark SQL 2.4.8 操作 Dataframe的两种方式
Oct 16 SQL Server
SQL Server表分区删除详情
Oct 16 SQL Server
SQL Server实现分页方法介绍
Mar 16 SQL Server
SQL Server使用导出向导功能
Apr 08 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
SQL Server Agent 服务无法启动
Apr 20 SQL Server
SQL Server删除表中的重复数据
May 25 SQL Server
详解SQL报错盲注
Jul 23 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
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
JS判断是否360安全浏览器极速内核的方法
2015/01/29 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
nodejs multer实现文件上传与下载
2017/05/10 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
centos7之Python3.74安装教程
2019/08/15 Python
Python selenium自动化测试模型图解
2020/04/15 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
python操作链表的示例代码
2020/09/27 Python
荷兰本土平价百货:HEMA
2017/10/23 全球购物
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
楼面经理岗位职责范本
2014/02/18 职场文书
幼儿园小班家长寄语
2014/04/02 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android
Golang 1.18 多模块Multi-Module工作区模式的新特性
2022/04/11 Golang