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 相关文章推荐
SqlServer 垂直分表(减少程序改动)
Apr 16 SQL Server
SqlServer数据库远程连接案例教程
Jul 15 SQL Server
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
Sep 04 SQL Server
Windows环境下实现批量执行Sql文件
Oct 05 SQL Server
通过T-SQL语句创建游标与实现数据库加解密功能
Mar 16 SQL Server
SQL Server表分区降低运维和维护成本
Apr 08 SQL Server
MSSQL基本语法操作
Apr 11 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
SQL Server中使用表变量和临时表
May 20 SQL Server
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
May 25 SQL Server
一次SQL查询优化原理分析(900W+数据从17s到300ms)
Jun 10 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中的CMS的涵义
2007/03/11 PHP
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
PHP IE中下载附件问题解决方法
2014/01/07 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
jquery异步请求实例代码
2011/06/21 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
使用JS动态显示文本
2017/09/09 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
Postman内建变量常用方法实例解析
2020/07/28 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
python编写俄罗斯方块
2020/03/13 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
2014新课程改革心得体会
2014/03/10 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
开学寄语大全
2014/04/08 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
儿园租房协议书范本
2014/12/02 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
八年级语文教学反思
2016/03/03 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
七年级作文之我的梦想
2019/10/16 职场文书
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
2021/12/06 HTML / CSS