递归查询通过WITH RECURSIVE实现,用于处理树形结构数据。它包含非递归初始查询和引用自身CTE的递归部分,用UNION ALL连接,需设置终止条件避免无限循环。示例中从员工表查某领导所有下属,包括间接下属,并可添加层级字段控制深度,建议对manager_id等字段建索引以提升性能。

PostgreSQL 支持递归查询,通过 WITH RECURSIVE 实现。它允许你查询具有层次结构或树形结构的数据,比如组织架构、分类目录、评论与回复等场景。
什么是递归查询?
递归查询是一种自引用的查询方式,它会反复执行直到没有新结果产生。在 PostgreSQL 中,使用 WITH RECURSIVE 定义一个公共表表达式(CTE),包含:
- 非递归部分:初始查询,提供基础数据
- 递归部分:引用自身 CTE 名称,逐步向下查找
基本语法示例
WITH RECURSIVE t(n) AS ( SELECT 1 -- 非递归项 UNION ALL SELECT n + 1 -- 递归项 FROM t WHERE n结果输出 1 到 5 的数字序列。这只是一个简单演示,实际中常用于树状结构。
实际应用场景:组织架构
假设有一个员工表,每个员工有直属上级(manager_id),想查出某个领导下的所有下属(包括间接下属):
WITH RECURSIVE org_tree AS ( -- 基础成员:目标领导本人 SELECT id, name, manager_id FROM employees WHERE name = 'Alice'UNION ALL
25175企业客户管理系统能够方便的录入新的信息例如新的项目、新增客户等同时能够清楚的管理一些款项结算。由于功能的强大,用户可以在该系统上发表文章后让员工递交工作计划或工作报告。加强企业工作效率,为企业提高实力。因为该系统可由客户、程序员、负责人等身份登入 所以适合广大企业使用。管理首页:{信息录入|信息修改|信息查询}1信息录入:你可以根据实际情况进行以下操作 1-1新的项目
-- 递归成员:查找其下属
SELECT e.id, e.name, e.manager_id
FROM employees e
INNER JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT * FROM org_tree;
这条查询会列出 Alice 及她所有层级的下属。
注意事项
使用递归查询时注意以下几点:
- 必须包含非递归部分和递归部分,用 UNION 或 UNION ALL 连接
- 避免无限循环,确保递归有终止条件(如 WHERE 限制)
- 性能方面,深层递归可能较慢,建议对关键字段建立索引(如 parent_id)
- 可添加 level 字段标记层级,便于控制深度
基本上就这些。PostgreSQL 的递归查询功能强大且标准兼容,处理层级数据非常实用。









