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

如何在SQL Server 2019生成符合D3.js树形图要求的JSON

解决SQL Server生成D3.js树形图JSON时子节点统一命名为"children"的问题

要避免手动修改JSON的步骤,核心是放弃FOR JSON AUTO的自动映射逻辑,改用FOR JSON PATH手动定义JSON结构,让每一层级的子节点都统一命名为children。以下提供两种适配方案,根据你的实际查询场景选择:

方案一:递归CTE适配任意层级(推荐)

如果你的节点层级是动态的(虽当前支持最多6级,但递归方式更灵活),可以用递归CTE先统一获取所有节点的层级关系,再嵌套生成children结构:

-- 递归CTE获取所有节点的层级关系
WITH RecursiveNodes AS (
    -- 锚点:根节点(根据你的实际表结构调整根节点判断条件,比如parent_id=0或NULL)
    SELECT 
        node_id AS id,
        node_name AS name,
        parent_node_id AS parent_id
    FROM YourNodeTable
    WHERE parent_node_id IS NULL
    UNION ALL
    -- 递归获取子节点
    SELECT 
        t.node_id AS id,
        t.node_name AS name,
        t.parent_node_id AS parent_id
    FROM YourNodeTable t
    INNER JOIN RecursiveNodes rn ON t.parent_node_id = rn.id
)
-- 嵌套生成带统一children的JSON结构
SELECT 
    id,
    name,
    -- 生成第二级children
    (
        SELECT 
            id,
            name,
            -- 生成第三级children
            (
                SELECT 
                    id,
                    name,
                    -- 生成第四级children
                    (
                        SELECT 
                            id,
                            name,
                            -- 生成第五级children
                            (
                                SELECT 
                                    id,
                                    name,
                                    -- 生成第六级children
                                    (SELECT id, name FROM RecursiveNodes WHERE parent_id = rn4.id FOR JSON PATH) AS children
                                FROM RecursiveNodes rn4 WHERE parent_id = rn3.id FOR JSON PATH
                            ) AS children
                        FROM RecursiveNodes rn3 WHERE parent_id = rn2.id FOR JSON PATH
                    ) AS children
                FROM RecursiveNodes rn2 WHERE parent_id = rn1.id FOR JSON PATH
            ) AS children
        FROM RecursiveNodes rn1 WHERE parent_id = root.id FOR JSON PATH
    ) AS children
FROM RecursiveNodes root
WHERE parent_id IS NULL -- 仅输出根节点,构建完整树形
FOR JSON PATH, ROOT('root'); -- ROOT可选,根据D3所需的顶层结构调整

方案二:固定6级关联适配原查询结构

如果你坚持使用原有的l1至l6层级关联逻辑,只需在每一层的子查询中把结果别名设为children即可:

SELECT
    l1.node_id AS id,
    l1.node_name AS name,
    -- 第二级节点,别名children
    (
        SELECT
            l2.node_id AS id,
            l2.node_name AS name,
            -- 第三级节点,别名children
            (
                SELECT
                    l3.node_id AS id,
                    l3.node_name AS name,
                    -- 第四级节点,别名children
                    (
                        SELECT
                            l4.node_id AS id,
                            l4.node_name AS name,
                            -- 第五级节点,别名children
                            (
                                SELECT
                                    l5.node_id AS id,
                                    l5.node_name AS name,
                                    -- 第六级节点,别名children
                                    (SELECT l6.node_id AS id, l6.node_name AS name FROM l6 WHERE l6.parent_id = l5.id FOR JSON PATH) AS children
                                FROM l5 WHERE l5.parent_id = l4.id FOR JSON PATH
                            ) AS children
                        FROM l4 WHERE l4.parent_id = l3.id FOR JSON PATH
                    ) AS children
                FROM l3 WHERE l3.parent_id = l2.id FOR JSON PATH
            ) AS children
        FROM l2 WHERE l2.parent_id = l1.id FOR JSON PATH
    ) AS children
FROM l1
FOR JSON PATH;

关键说明

  • FOR JSON PATH允许你完全自定义JSON的键名和结构,而FOR JSON AUTO会根据表/别名自动生成键,这是导致l2、l3等命名的核心原因。
  • 若节点需要其他属性(如用于树形图的value、size),只需在对应的SELECT语句中添加字段即可,保持各层级结构一致。
  • 两种方案生成的JSON中,所有子节点数组都会统一命名为children,完全符合D3.js树形图的要求,无需手动修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:12:50