⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

SQL CTE递归:处理树形与层次数据

使用公用表表达式(CTE)实现递归查询,轻松处理层级关系数据 · 难度:入门 · +15XP

什么是递归CTE?

公用表表达式(CTE)是SQL中定义临时结果集的一种方式。递归CTE能够引用自身,特别适合处理树形结构数据,如组织架构、分类目录、评论回复等。

语法结构

WITH RECURSIVE cte_name AS (
  -- 锚点查询(初始结果)
  SELECT ... FROM table WHERE condition
  UNION ALL
  -- 递归查询(引用自身)
  SELECT ... FROM cte_name JOIN table ON ...
)
SELECT * FROM cte_name;

注意:必须包含两个部分,并用UNION ALL连接。递归部分必须引用CTE自身,且最终需要终止条件(通常通过WHERE或JOIN条件)。

实战案例:组织架构树

假设员工表包含id, name, manager_id(上级ID)。

WITH RECURSIVE org_tree AS (
  -- 锚点:找到最高领导(没有上级的人)
  SELECT id, name, manager_id, 1 AS level
  FROM employees
  WHERE manager_id IS NULL
  
  UNION ALL
  
  -- 递归:找到每个员工的下属
  SELECT e.id, e.name, e.manager_id, t.level + 1
  FROM employees e
  INNER JOIN org_tree t ON e.manager_id = t.id
)
SELECT * FROM org_tree ORDER BY level, id;

生成数字序列

递归CTE也可以用于生成连续的数字或日期:

WITH RECURSIVE number_series AS (
  SELECT 1 AS num
  UNION ALL
  SELECT num + 1 FROM number_series WHERE num < 10
)
SELECT * FROM number_series;

性能与限制

大多数数据库默认递归深度限制为100或1000层(如SQLite默认1000,MySQL默认1000)。可通过设置参数调整,但应避免无限递归。

练习提示

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 146 篇
0 完成
🔥 0