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数据库单表查询 4.3实验课
Apr 05 SQL Server
SQL Server连接查询的实用教程
Apr 07 SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
Apr 16 SQL Server
mybatis调用sqlserver存储过程返回结果集的方法
May 08 SQL Server
sql通过日期判断年龄函数的示例代码
Jul 16 SQL Server
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
Sep 04 SQL Server
SQL SERVER实现连接与合并查询
Feb 24 SQL Server
SQL SERVER触发器详解
Feb 24 SQL Server
SQL Server远程连接的设置步骤(图文)
Mar 23 SQL Server
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
Apr 22 SQL Server
SQL Server 忘记密码以及重新添加新账号
Apr 26 SQL Server
SQL解决未能删除约束问题drop constraint
May 30 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安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
使用python实现扫描端口示例
2014/03/29 Python
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python中如何导入类示例详解
2019/04/17 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
python 字段拆分详解
2019/12/17 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
python爬虫工具例举说明
2020/11/30 Python
Coach澳大利亚官方网站:美国著名时尚奢侈品牌
2017/05/24 全球购物
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
GWT都有什么特性
2016/12/02 面试题
个人安全承诺书
2014/05/22 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
项目投资合作意向书
2014/07/29 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL