sql server OUTER APPLY使用

一、OUTER APPLY = 对每行数据,执行一次子查询,并把结果拼接到当前行

  • 相当于 "带行参数的 LEFT JOIN"
  • 专门解决:子查询需要引用外部表字段 的场景
  • 性能远优于传统的 LEFT JOIN + 子查询

和 CROSS APPLY / LEFT JOIN 的区别

二、最简单的示例

场景

学生表 + 成绩表,要给每个学生查最新 1 条成绩

传统 LEFT JOIN(写起来麻烦、性能差)
sql 复制代码
SELECT s.*, sc.Score
FROM Student s
LEFT JOIN (
    SELECT TOP 1 Score FROM Score WHERE StudentId = s.StudentId  -- 报错!无法引用 s
) sc ON 1=1

OUTER APPLY(完美解决)

sql 复制代码
SELECT s.*, sc.Score
FROM Student s
OUTER APPLY (
    -- 这里可以直接用 s.StudentId,每行执行一次
    SELECT TOP 1 Score 
    FROM Score 
    WHERE StudentId = s.StudentId
    ORDER BY CreateTime DESC
) sc

结果

  • 所有学生都会显示
  • 有成绩 → 显示成绩
  • 无成绩 → 显示 NULL

优势:

  1. 逐行过滤,只查当前行需要的数据
  2. 不生成临时结果集,内存占用极低
  3. 配合索引 = 极速查询

三、OUTER APPLY 最常用 3 大场景

1. 取每组 TOP N 数据(最常用)

每个分类取最新 / 最贵一条

sql 复制代码
SELECT *
FROM 分类表 c
OUTER APPLY (
    SELECT TOP 1 * FROM 商品表 g 
    WHERE g.分类ID = c.ID 
    ORDER BY g.创建时间 DESC
) g

2. 子查询必须引用外部表字段

传统 JOIN 做不到,只有 APPLY 可以

3. 替代复杂的 LEFT JOIN,简化 SQL

尤其适合关联视图、函数、子查询

相关推荐
阿里云大数据AI技术1 小时前
一条 SQL 生成广告:Hologres 如何实现素材生成到投放分析一体化
人工智能·sql
dishugj1 小时前
HANA 数据库的核心进程架构
数据库
2301_782040451 小时前
CSS Flex布局中如何实现导航栏与Logo的左右分布_利用justify-content- space-between
jvm·数据库·python
.柒宇.2 小时前
Redis主从复制集群搭建详解
数据库·redis·缓存·主从复制
2301_808414382 小时前
MySQL中的函数
数据库·mysql
Mahir082 小时前
MySQL 数据一致性的基石:三大日志( redo log/undo log/binlog)与两阶段提交(Prepare 阶段和Commit 阶段)深度解密
数据库·后端·mysql·面试
x***r1513 小时前
dbeaver-ce-24.1.3-x86_64-setup安装步骤详解(附DBeaver数据库管理与SQL编写教程)
数据库·sql
一只鹿鹿鹿3 小时前
数据库运维与管理规范(WORD)
运维·数据库
todoitbo3 小时前
WHERE 子句中的函数执行顺序与副作用风险分析
数据库·时序数据库·函数
jiayong233 小时前
MySQL 8.0 Root 用户远程登录配置完整指南
数据库·mysql