You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL递归查询所有节点的祖先节点

用PostgreSQL查询树形结构中每个节点的所有祖先节点

假设你的表名为tree_nodes(实际表名不同时替换即可),表结构如下:

node_idparent_id
Anull
BA
CA
DB

可以使用**递归CTE(Common Table Expression)**实现需求,SQL语句如下:

WITH RECURSIVE node_ancestors AS (
    -- 基础查询:获取非根节点的直接父节点
    SELECT 
        node_id, 
        parent_id AS ancestor_id
    FROM tree_nodes
    WHERE parent_id IS NOT NULL

    UNION ALL

    -- 递归查询:向上遍历获取所有层级的祖先节点
    SELECT 
        na.node_id, 
        tn.parent_id AS ancestor_id
    FROM node_ancestors na
    JOIN tree_nodes tn ON na.ancestor_id = tn.node_id
    WHERE tn.parent_id IS NOT NULL
)
SELECT node_id, ancestor_id
FROM node_ancestors
ORDER BY node_id, ancestor_id DESC;

代码说明:

  • 基础部分:筛选出所有非根节点,先获取它们的直接父节点作为第一层祖先。
  • 递归部分:以已找到的祖先节点为起点,继续向上关联其父节点,直到遍历到根节点(根节点无父节点,tn.parent_id IS NOT NULL用于终止递归)。
  • 最终输出:取出所有结果并按node_id、ancestor_id降序排列,与期望输出一致。

执行后得到的结果:

node_idancestor_id
BA
CA
DB
DA

内容的提问来源于stack exchange,提问作者Shalev Sror

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:35:40