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
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
Jun 30 SQL Server
SQL Server代理:理解SQL代理错误日志处理方法
Jun 30 SQL Server
SQLServer中exists和except用法介绍
Dec 04 SQL Server
SQL SERVER触发器详解
Feb 24 SQL Server
SQL Server远程连接的设置步骤(图文)
Mar 23 SQL Server
SQL Server 中的事务介绍
May 20 SQL Server
SQL Server中搜索特定的对象
May 25 SQL Server
SQL Server携程核心系统无感迁移到MySQL实战
Jun 01 SQL Server
SQL Server2019安装的详细步骤实战记录(亲测可用)
Jun 10 SQL Server
SQL中的连接查询详解
Jun 21 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批量删除数据
2007/01/18 PHP
php入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
php跨服务器访问方法小结
2015/05/12 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
python学生信息管理系统
2018/03/13 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
vscode调试django项目的方法
2020/08/06 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
html5画布旋转效果示例
2014/01/27 HTML / CSS
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
高校十八大报告感想
2014/01/27 职场文书
应届生找工作求职信
2014/06/24 职场文书
2015入党自荐书范文
2015/03/05 职场文书
身份证丢失证明
2015/06/19 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
某药房的新员工入职告知书!
2019/07/15 职场文书
Python实现归一化算法详情
2022/03/18 Python
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android