pg sql递归查询子类的最大父类
时间: 2025-06-23 09:53:57 浏览: 8
在 PostgreSQL 中,使用递归查询(`WITH RECURSIVE`)可以高效地处理树状结构数据,例如查找某个子类的最大父类。这种查询方式通过公共表表达式(CTE)来实现递归逻辑,能够避免在应用程序代码中进行多次递归调用,从而减少数据库的网络开销和性能损耗。
假设存在一个分类表 `categories`,其结构如下:
```sql
CREATE TABLE categories (
id INTEGER PRIMARY KEY,
name VARCHAR(100),
parent_id INTEGER REFERENCES categories(id)
);
```
其中,`parent_id` 表示当前分类的父类 ID。若要查找某个子类的“最大父类”(即最顶层的根节点),可以使用如下的递归查询语句:
```sql
WITH RECURSIVE category_tree AS (
-- 递归基:选择指定的子类作为起始点
SELECT
id,
name,
parent_id,
id AS root_id, -- 当前节点作为初始根
name AS root_name -- 初始根名称
FROM
categories
WHERE
id = 5 -- 假设我们要查找的是 ID 为 5 的子类的最大父类
UNION ALL
-- 递归步骤:向上查找父类
SELECT
c.id,
c.name,
c.parent_id,
ct.root_id, -- 保持根 ID 不变
ct.root_name -- 保持根名称不变
FROM
categories c
INNER JOIN
category_tree ct ON c.id = ct.parent_id
)
-- 最终选择根节点
SELECT
root_id AS max_parent_id,
root_name AS max_parent_name
FROM
category_tree
WHERE
parent_id IS NULL; -- 父类为空,表示这是最大父类(根节点)
```
### 示例说明:
- **递归基**部分从指定的子类开始,设置其自身为当前路径的根节点。
- **递归步骤**不断向上查找父类,并保持根节点信息不变。
- 最终查询筛选出 `parent_id IS NULL` 的记录,即代表最大父类(根节点)[^4]。
---
阅读全文
相关推荐















