递归查询通过WITH RECURSIVE实现,先执行非递归部分获取初始节点,再迭代连接结果与原表生成下一层级,直至无新数据;常用于树形结构,需注意终止条件与环路检测。

PostgreSQL 的递归查询通过 CTE(Common Table Expression) 实现,使用 WITH RECURSIVE 关键字。它特别适合处理树形结构或层级数据,比如组织架构、分类目录、评论回复链等。
一个递归 CTE 由两个部分组成:非递归项(初始查询)和递归项,用 UNION [ALL] 连接:
WITH RECURSIVE cte_name AS (
-- 非递归部分(基础查询)
SELECT ...
FROM table
WHERE 条件(通常是顶层节点)
<pre class='brush:php;toolbar:false;'>UNION ALL
-- 递归部分
SELECT ...
FROM table
JOIN cte_name ON 连接条件) SELECT * FROM cte_name;
PostgreSQL 执行递归 CTE 并不是简单地“循环调用”,而是采用迭代方式,逐步构建结果集:
整个过程是逐层展开的,类似广度优先搜索(BFS),每一层代表一次递归深度。
假设有一个员工表 employees(id, name, manager_id),其中 manager_id 指向上级:
WITH RECURSIVE org_tree AS (
-- 基础:从 CEO 开始(manager_id 为 NULL)
SELECT id, name, manager_id, 0 AS level
FROM employees
WHERE manager_id IS NULL
<pre class='brush:php;toolbar:false;'>UNION ALL
-- 递归:查找所有下属
SELECT e.id, e.name, e.manager_id, ot.level + 1
FROM employees e
JOIN org_tree ot ON e.manager_id = ot.id) SELECT * FROM org_tree;
执行流程:
递归查询虽然强大,但必须注意以下几点:
ARRAY 记录路径来检测环:
WITH RECURSIVE path_check AS (
SELECT id, name, ARRAY[id] AS path
FROM employees
WHERE manager_id IS NULL
<pre class='brush:php;toolbar:false;'>UNION ALL
SELECT e.id, e.name, pc.path || e.id
FROM employees e
JOIN path_check pc ON e.manager_id = pc.id
WHERE e.id != ALL(pc.path) -- 防止环路) SELECT * FROM path_check;
基本上就这些。PostgreSQL 的递归 CTE 是处理层级数据的利器,理解其迭代执行机制有助于写出高效且安全的查询。不复杂但容易忽略的是终止条件和环路检测。
以上就是postgresql递归查询如何执行_postgresqlcte递归机制的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号