本章要回答的三个问题:嵌套四层的子查询为什么没人敢改,WITH 子句(CTE)怎么把它拆成命名分步的流水线?一张自指的分类树怎么用递归 CTE 一次查完整条祖先链?同一句复杂查询被报表、接口、同事反复复制,视图怎么把它固化成一张"虚拟表"统一出口?本章是查询主峰的最后一级台阶:从"会写"到"会组织"。
第 6 章结尾你已经体会过子查询的痛:括号套括号,读的人要在脑子里维护一个栈才能理解作者意图。CTE(Common Table Expression,公用表表达式)的发明动机极其朴素——给子查询起名字。WITH sales AS (SELECT ...) 把"销售明细聚合"这件事命名成一个临时视图,主查询引用名字而非嵌套括号,复杂逻辑立刻获得分步的骨架。它不是新能力(子查询都能等价改写),而是组织能力——工程里"可维护"三个字,多数时候比"能跑"值钱。
递归 CTE 则提供了此前全书都没有的能力:引用自己。分类树、组织架构、物料清单、评论楼层——凡是"祖先后代"结构,普通查询一层连接只能展开一层,递归 CTE 让查询自己走下去直到尽头。本章最后把视图与 CTE 收拢:一个是存进数据库的命名查询,一个是写在语句里的命名查询,配合第 7 章的窗口函数,完成一次真实业务查询的重构演练。
| 节 | 回答哪个问题 | 关键产出 |
|---|---|---|
| 8.1 CTE 基础:WITH 子句 | 子查询怎么起名 | 单个与多个 CTE、链式引用、与派生表对照 |
| 8.2 递归 CTE | 树形结构怎么一次查完 | 锚加递归项结构、祖先链、日期序列、失控防护 |
| 8.3 视图与综合重构 | 常用查询怎么统一出口 | CREATE VIEW、可更新边界、嵌套→CTE→视图全流程 |
子查询是匿名的临时工,CTE 是挂牌的项目组,视图是常设的部门——同一件事,组织方式决定维护成本。
查询主线到此登顶:单表、多表、子查询、窗口、CTE 全部在手。第 9 章转向"守护"——事务保证一批改动同生共死,权限管住谁能动数据,存储过程把业务规则搬进数据库。第 10 章最后回答"怎么跑得快"。