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
SQL Server连接查询的实用教程
Apr 07 SQL Server
SQLServer中JSON文档型数据的查询问题解决
Jun 27 SQL Server
MySQL 中如何归档数据的实现方法
Mar 16 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
SQL Server 忘记密码以及重新添加新账号
Apr 26 SQL Server
SQL Server使用T-SQL语句批处理
May 20 SQL Server
在SQL Server中使用 Try Catch 处理异常的示例详解
Jul 15 SQL Server
SQL bool盲注和时间盲注详解
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
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
PHP 正则表达式小结
2015/02/12 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
javascript css在IE和Firefox中区别分析
2009/02/18 Javascript
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
jQuery.buildFragment使用方法及思路分析
2013/01/07 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
小程序实现搜索框
2020/06/19 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
Python寻找路径和查找文件路径的示例
2019/07/10 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
keras中的loss、optimizer、metrics用法
2020/06/15 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
Linux操作面试题
2012/05/16 面试题
超市开店计划书
2014/04/26 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
党小组推荐意见
2015/06/02 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python