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

Oracle树形层级CONNECT BY查询路径拼接顺序调整咨询

Oracle层级查询正序拼接节点路径解决方案

问题原因

你当前得到倒序路径的核心原因是层级查询的遍历方向为从当前节点向上追溯父节点,SYS_CONNECT_BY_PATH函数会按照遍历顺序拼接节点值,因此最终结果呈现子节点在前、根节点在后的倒序效果。

修改方案

仅需要调整层级查询的遍历方向、根节点声明,以及对应字段取值逻辑即可,核心修改点如下:

  • 将原CONNECT BY的关联关系反转,改为从父节点向下遍历子节点
  • 新增START WITH指定根节点筛选条件(父ID为空的节点)
  • 移除仅输出叶子节点的过滤条件,直接取当前节点ID作为STARTING_REF_ID

调整后完整SQL

WITH
    refs (ref_id,
          ref_type_id,
          parent_ref_id,
          ref_value)
    AS
        (SELECT 501, 1, NULL, 207 FROM DUAL
         UNION ALL
         SELECT 502, 2, 501, 4 FROM DUAL
         UNION ALL
         SELECT 503, 3, 502, 1 FROM DUAL)
    SELECT r.ref_id as starting_ref_id,
           TRIM (
               ',' FROM
                   SYS_CONNECT_BY_PATH (
                          CASE r.ref_type_id
                              WHEN 1 THEN 'article '
                              WHEN 2 THEN 'par '
                              WHEN 3 THEN '('
                              WHEN 4 THEN 'point '
                              WHEN 5 THEN 'sous '
                              WHEN 6 THEN NULL
                              WHEN 8 THEN NULL
                              ELSE '/'
                          END
                       || r.ref_id,
                       ','))    AS ref_label
      FROM refs r
     START WITH r.parent_ref_id IS NULL
CONNECT BY PRIOR r.ref_id = r.parent_ref_id;

输出结果验证

执行上述SQL后输出结果和预期一致:

STARTING_REF_IDREF_LABEL
501article 501
502article 501,par 502
503article 501,par 502,(503

如果需要保留路径末尾的逗号,删除TRIM函数的包裹逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:24:02