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_ID | REF_LABEL |
|---|---|
| 501 | article 501 |
| 502 | article 501,par 502 |
| 503 | article 501,par 502,(503 |
如果需要保留路径末尾的逗号,删除TRIM函数的包裹逻辑即可。
内容的提问来源于stack exchange,提问作者user12259208
相关产品推荐
相关产品推荐

