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

如何从邻接表树结构生成每个叶子节点的JSON路径?

生成树中每个叶子节点的单独JSON路径

节点表结构

我用邻接表存储了一棵多节点树,每条记录对应一个节点及其父节点,表结构如下:

node_idparent_id
Anull
BA
CA
DB
EB

需求说明

需要编写逻辑,为树中的每个叶子节点生成对应的JSON路径,预期结果如下:

leaf_idjson_path
C{"name": "A", "children": [{ "name": "C", "children": [] }] }
D{"name": "A", "children": [{ "name": "B", "children": [{ "name": "D", "children": [] }] }] }
E{"name": "A", "children": [{ "name": "B", "children": [{ "name": "E", "children": [] }] }] }

目前已有能生成完整嵌套JSON树结构的函数,但我需要的是每个叶子节点单独的JSON路径。

PostgreSQL实现方案

  1. 先通过递归CTE获取每个叶子节点的完整路径
WITH RECURSIVE node_paths AS (
    -- 从根节点开始初始化路径
    SELECT node_id, parent_id, ARRAY[node_id] AS path
    FROM your_table
    WHERE parent_id IS NULL
    UNION ALL
    -- 递归遍历子节点,拼接完整路径
    SELECT child.node_id, child.parent_id, parent.path || child.node_id
    FROM your_table child
    JOIN node_paths parent ON child.parent_id = parent.node_id
),
leaf_nodes AS (
    -- 筛选出叶子节点(无下属子节点的节点)
    SELECT node_id AS leaf_id, path
    FROM node_paths np
    WHERE NOT EXISTS (
        SELECT 1 FROM your_table t WHERE t.parent_id = np.node_id
    )
)
  1. 基于路径递归构建对应JSON结构
    将上述CTE与递归JSON生成逻辑结合,最终得到每个叶子节点的单独JSON路径:
SELECT 
    leaf_id,
    (
        WITH RECURSIVE json_builder(path_items, current_json) AS (
            -- 从叶子节点初始化最内层JSON
            SELECT path, json_build_object('name', last(path), 'children', '[]'::json)
            FROM leaf_nodes
            UNION ALL
            -- 递归向上拼接父节点的JSON结构
            SELECT 
                path_items[1:array_length(path_items, 1)-1],
                json_build_object(
                    'name', last(path_items[1:array_length(path_items, 1)-1]),
                    'children', json_build_array(current_json)
                )
            FROM json_builder
            WHERE array_length(path_items, 1) > 1
        )
        -- 提取根节点层级的最终JSON结果
        SELECT current_json FROM json_builder WHERE array_length(path_items, 1) = 1
    ) AS json_path
FROM leaf_nodes;

注意将代码中的your_table替换为实际的表名。

内容的提问来源于stack exchange,提问作者Yosef Cohen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:20:58