1. 递归SQL与树形数据处理基础
树形结构数据在业务系统中无处不在——组织架构、产品分类、评论回复链、权限体系等场景都需要处理父子关系数据。传统SQL在处理这类数据时面临巨大挑战:需要编写复杂且低效的多表连接查询,或者依赖应用程序进行多次查询和内存拼接。
递归SQL通过通用表表达式(CTE)的WITH RECURSIVE语法,实现了在单条SQL语句中遍历任意深度树形结构的能力。其核心原理是:
- 基础部分:定位起始节点(如查询某部门的顶级上级)
- 递归部分:通过自引用不断扩展结果集(如逐级查找上级部门)
sql复制WITH RECURSIVE org_hierarchy AS (
-- 基础查询(起点)
SELECT id, name, parent_id, 1 AS level
FROM department
WHERE id = 101 -- 从ID=101的部门开始
UNION ALL
-- 递归查询(向上查找父部门)
SELECT d.id, d.name, d.parent_id, h.level + 1
FROM department d
JOIN org_hierarchy h ON d.id = h.parent_id
)
SELECT * FROM org_hierarchy;
这个典型递归查询展示了三个关键要素:
- 递归CTE的命名(org_hierarchy)
- 基础部分确定查询起点
- 递归部分通过JOIN实现自引用
注意:不同数据库对递归深度有限制,MySQL默认1000层,可通过设置cte_max_recursion_depth参数调整
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 树形数据存储模型对比分析
实际业务中主要有三种树形数据存储方案,各有适用场景:
| 模型类型 | 代表方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 邻接表 | parent_id字段 | 结构简单,写入快 | 查询复杂度高 | 层级固定的简单结构 |
| 路径枚举 | path字段(1/2/3/) | 查询效率高 | 更新成本高 | 读多写少的深层结构 |
| 闭包表 | 单独的关系表 | 查询灵活,支持多父节点 | 存储空间大 | 复杂网状关系 |
递归SQL最适合处理邻接表模型,这也是最常见的存储方式。例如电商分类表结构:
sql复制CREATE TABLE product_category (
id IN
