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 相关文章推荐
SQLServer2019 数据库的基本使用之图形化界面操作的实现
Apr 08 SQL Server
如何有效防止sql注入的方法
May 25 SQL Server
SQL Server2019数据库备份与还原脚本,数据库可批量备份
Nov 20 SQL Server
SQLServer中exists和except用法介绍
Dec 04 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
SQL Server表分区降低运维和维护成本
Apr 08 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
SQL Server中使用表变量和临时表
May 20 SQL Server
SQL Server使用T-SQL语句批处理
May 20 SQL Server
SQL Server使用PIVOT与unPIVOT实现行列转换
May 25 SQL Server
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
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 Static关键字实用方法
2010/06/04 PHP
探讨方法的重写(覆载)详解
2013/06/08 PHP
解析php中memcache的应用
2013/06/18 PHP
PHP中session变量的销毁
2014/02/27 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
2016/04/02 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
2017/10/22 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
微信小程序App生命周期详解
2018/01/31 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
jQuery滑动效果实现方法分析
2018/09/05 jQuery
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
python让列表倒序输出的实例
2018/06/25 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
django项目搭建与Session使用详解
2018/10/10 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
6种非常炫酷的CSS3按钮边框动画特效
2016/03/16 HTML / CSS
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
初一英语教学反思
2014/01/11 职场文书
教师党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
总经理助理岗位职责
2015/01/31 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server