将列作为路径(面包屑/级别)的表转换为层次结构(树)表示

问题描述 投票:0回答:1

如何将具有路径(面包屑/级别)的 Oracle 表转换为 Oracle 层次结构表示表(如树结构)。

原表结构:

enter image description here

需要的表结构:

enter image description here

其实是从十几个网站收集的面包屑。我想在 APEX 应用程序中将收集的面包屑格式化为树视图。

sql oracle
1个回答
1
投票

您可以使用:

SELECT id,
       CASE LEVEL
       WHEN 1 THEN level_1
       WHEN 2 THEN level_2
       WHEN 3 THEN level_3
       WHEN 4 THEN level_4
       WHEN 5 THEN level_5
       END As value,
       PRIOR id As parent
FROM   table_name
START WITH level_2 IS NULL
CONNECT BY
       PRIOR level_1 = level_1
AND    (  (PRIOR level_2 IS NULL AND level_2 IS NOT NULL AND level_3 IS NULL)
       OR (PRIOR level_2 = level_2 AND PRIOR level_3 IS NULL AND level_3 IS NOT NULL AND level_4 IS NULL)
       OR (PRIOR level_2 = level_2 AND PRIOR level_3 = level_3 AND PRIOR level_4 IS NULL AND level_4 IS NOT NULL AND level_5 IS NULL)
       OR (PRIOR level_2 = level_2 AND PRIOR level_3 = level_3 AND PRIOR level_4 = level_4 AND PRIOR level_5 IS NULL AND level_5 IS NOT NULL)
       )

对于样本数据:

CREATE TABLE table_name (id, level_1, level_2, level_3, level_4, level_5) AS
SELECT 1, 'Fasteners', NULL, NULL, NULL, NULL FROM DUAL UNION ALL
SELECT 2, 'Fasteners', 'Nails', NULL, NULL, NULL FROM DUAL UNION ALL
SELECT 3, 'Fasteners', 'Nails', 'Nuts washers', NULL, NULL FROM DUAL UNION ALL
SELECT 4, 'Fasteners', 'Nails', 'Nuts washers', 'Nuts', NULL FROM DUAL UNION ALL
SELECT 5, 'Fasteners', 'Nails', 'Nuts washers', 'Nuts', 'Hex nuts' FROM DUAL UNION ALL
SELECT 11, 'Power tools', NULL, NULL, NULL, NULL FROM DUAL UNION ALL
SELECT 12, 'Power tools', 'Power saws', NULL, NULL, NULL FROM DUAL UNION ALL
SELECT 13, 'Power tools', 'Power saws', 'Band saws', NULL, NULL FROM DUAL UNION ALL
SELECT 14, 'Power tools', 'Power saws', 'Circular saws', NULL, NULL FROM DUAL;

输出:

身份证 价值 家长
1 紧固件
2 指甲 1
3 螺母垫圈 2
4 坚果 3
5 六角螺母 4
11 电动工具
12 电锯 11
13 带锯 12
14 圆锯 12

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.