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数据库单表查询 4.3实验课
Apr 05 SQL Server
解决sql server 数据库,sa用户被锁定的问题
Jun 11 SQL Server
sql通过日期判断年龄函数的示例代码
Jul 16 SQL Server
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
Sep 04 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
SQL Server #{}可以防止SQL注入
May 11 SQL Server
SQL Server中锁的用法
May 20 SQL Server
在SQL Server中使用 Try Catch 处理异常的示例详解
Jul 15 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自动反斜杠的函数代码
2010/01/05 PHP
php对称加密算法示例
2014/05/07 PHP
浅析php单例模式
2014/11/25 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
javascript中的prototype属性使用说明(函数功能扩展)
2010/08/16 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
python实现简易学生信息管理系统
2020/04/05 Python
Python Pandas 转换unix时间戳方式
2019/12/07 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
经贸专业毕业生求职信
2014/03/23 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技