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

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

相关推荐
Rick19935 分钟前
联合索引是按顺序排好序的
数据库·mysql
步十人9 分钟前
【Redis】网络高并发模型
网络·数据库·redis
我是一颗柠檬11 分钟前
【Redis】列表与集合Day4(2026年)
数据库·redis·后端·缓存
AOwhisky13 分钟前
Ceph系列第三期:Ceph 集群核心配置与管理
linux·运维·数据库·笔记·ceph
陈天伟教授25 分钟前
安装 AutoCAD 时,“可选工具“ 的详细说明。
数据库
zcn12631 分钟前
举一反三思路思考形如(列=参数 or decode函数)
数据库·sql优化改写
Xzh042339 分钟前
Redis黑马点评 实战复盘与面试高频考点详解
java·数据库·redis·面试
林的快手1 小时前
MySQL
数据库·oracle
身如柳絮随风扬1 小时前
MySQL 存储引擎深度解析:InnoDB vs MyISAM vs Memory,行锁实现与索引奥秘
数据库·mysql
KaMeidebaby1 小时前
卡梅德生物技术快报|基因测序技术在 46,XY 性发育障碍变异筛查中的流程与数据分析
服务器·前端·数据库·人工智能·算法·数据挖掘·数据分析