当前位置: 首页 > news >正文

关于SQL中OUTER APPLY 得用法

原文链接:https://www.cnblogs.com/wangzhening6/p/13940914.html

 
  • 前言

日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求。

比如,左表一条关联右表多条记录时,我需要控制右表的某一条多条记录跟左表匹配。貌似,INNER JOIN 或 LEFT OUTER JOIN 不能很好完成。

但是 CROSS APPLY 与 OUTER APPLY 可以,下面用示例说明。

 

  1. 示例一
  • 有两张表:Student(学生表)和 Score(成绩表),数据如下:

 

image

 

 

1)   查询每个学生最近两次的考试成绩

  1. 先试下 INNER JOIN

1)   SQL 代码

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

INNER JOIN Score AS T2 ON T1.StudentNo = T2.StudentNo

2)   结果:

 

image

 

3)   咦,不对,这不是我想要的结果。

 

  1. 2.   再看看 CROSS APPLY

1)   SQL 代码

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

2)   结果:

 

image

 

3)   嗯,这次对了,并且还是按照“考试时间”倒序排序的。

 

2)   查询每个学生最近两次的考试成绩,没有参加考试的同学成绩补 null

  1. 先试下 LEFT OUTER JOIN

1)   SQL 代码

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

LEFT OUTERJOIN Score AS T2 ON T1.StudentNo = T2.StudentNo

2)   结果:

 

image

 

3)   咦,不对,这又不是我想要的结果。

 

  1. 2.   再看看 OUTER APPLY

1)   SQL 代码

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

2)   结果:

 

image

 

3)   嗯,这次对了,不但按照“考试时间”倒序排序的,而且没有考试的同学也被查出来了。

 

  • 总结
  1. 理解 CROSS APPLY 与 OUTER APPLY(个人理解)

1)   CROSS APPLY 的意思是“交叉应用”,在查询时首先查询左表,然后右表的每一条记录跟左表的当前记录进行匹配。匹配成功则将左表与右表的记录合并为一条记录输出;匹配失败则抛弃左表与右表的记录。(与 INNER JOIN 类似)

2)   OUTER APPLY 的意思是“外部应用”,与 CROSS APPLY 的原理一致,只是在匹配失败时,左表与右表也将合并为一条记录输出,不过右表的输出字段为 null。(与 LEFT OUTER JOIN 类似)

 

  1. 使用场景:

1)   一个商品有多张图片,但是只想取最近的一张图片跟商品匹配。

http://www.jsqmd.com/news/714343/

相关文章:

  • 深度定制指南:构建你的专属资源捕获工作流
  • 芯片面积快被SRAM占了一半?资深工程师教你从DFT/BIST到形状规划的五大实战遴选心法
  • 精通Metasploit Framework:网络安全攻防实战与全链路渗透解析
  • 别再暴力循环了!‘校门外的树’这道题,用差分数组优化,效率提升一个数量级
  • 关于先礼后兵-你需要平时默认状态是兵才有用
  • 2026年不动产资产管理系统推荐,大型集团软件哪个好用 - 品牌2026
  • 苏州高职升学培训行业测评:合规化与透明化成主流,本土品牌领跑专转本赛道 - 一网推GEO招财兔
  • ComfyUI-Impact-Pack:AI图像精细化处理的终极解决方案
  • 如何快速为NVIDIA Profile Inspector添加多语言界面:新手友好的本地化指南
  • 2026新版免费工具,搞定AI搜索优化与GEO监测
  • Windows热键冲突检测终极指南:3分钟快速定位占用快捷键的程序
  • 高举高打中的高指的是什么--竞赛-自媒体-外包等例子-
  • 关于做商业单怎么跟进以及跳单的问题
  • 分享下我最近做的高校和政府业务的现状
  • 3个简单步骤:用Mem Reduct快速释放内存,彻底解决电脑卡顿问题
  • 从ElementUI到UniApp:如何把熟悉的`disabledDate`逻辑迁移到uni-datetime-picker控件上
  • 高考分数出来了-我说说对于选专业的看法
  • 关注在事上-而不是在具体的点上-格局就算是打开了
  • DeepSeek V4 深度测评:从代码生成、Windows 排障到 Agent 工作流的真实体验
  • 风口上的猪都能飞-猪甚至都觉得自己会飞
  • 2026消防水箱厂家口碑推荐,服务/资质/交付能力三维度权威对比 - 深度智识库
  • 从AD转Cadence OrCAD:手把手教你创建第一个原理图工程(含库文件管理避坑指南)
  • Gazebo 11.0 + ROS2 Foxy 环境下,TurtleBot3 仿真环境一键启动保姆级教程(含模型下载加速)
  • 父母让你找铁饭碗-你要追求自己的事业-来谈谈三个观点
  • 避坑指南:Unity调用C++ DLL时,那些让人头疼的‘内存对齐’和‘字符串传递’问题
  • RK3568外接MIPI屏踩坑实录:从屏幕不亮、触摸失灵到完美显示的排查指南
  • Git常用命令的Alias设置
  • 惯性思维其实是最大的问题-而且还不自知
  • GetQzonehistory:如何完整备份你的QQ空间青春记忆
  • AXI Burst的三种类型,在真实芯片里到底怎么用?(FIFO/Cache/DRAM场景拆解)