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

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

相关推荐
小白说大模型1 小时前
AI驱动的个性化学习路径:知识图谱与知识点关联的存储与推理
大数据·人工智能·学习·mysql·机器学习·prompt·知识图谱
这个DBA有点耶1 小时前
多模数据库深度解读:从“多库拼装”到“一库多能”的架构演进
数据库·mysql·dba
程序员夏洛2 小时前
MySQL 默认的事务隔离级别是什么?为什么选择这个级别?
数据库·mysql
艺术留白2 小时前
MokaTest使用篇-SQL接口
数据库·sql
卓怡学长2 小时前
w180springboot基于Java的悠扬乐器管理
java·spring boot·mysql·spring·maven·intellij-idea
( •̀∀•́ )9203 小时前
MySQL 自动备份与恢复方案
数据库·mysql·oracle
这个DBA有点耶3 小时前
大事务的“事前预防”:监控、拦截、Kill,四层防线一次讲透
数据库·mysql·代码规范
tachibana23 小时前
RAGAS 指标解读
数据库·人工智能·算法·机器学习·架构·大模型·llm
mlidongfeng4 小时前
[AI][昇腾950]TA 学习
数据库·学习
bestsun9994 小时前
rac集群环境下配置JDBC
数据库