WITH tab AS(
SELECT '01' 子节点,1 子节点等级,'-1' 父节点 FROM dual UNION ALL
SELECT '0101' 子节点,2 子节点等级,'01' 父节点 FROM dual UNION ALL
SELECT '010101' 子节点,3 子节点等级,'0101' 父节点 FROM dual UNION ALL
SELECT '01010101' 子节点,4 子节点等级,'010101' 父节点 FROM dual UNION ALL
SELECT '01010102' 子节点,4 子节点等级,'010101' 父节点 FROM dual UNION ALL
SELECT '0101010201' 子节点,5 子节点等级,'01010102' 父节点 FROM dual UNION ALL
SELECT '0101010202' 子节点,5 子节点等级,'01010102' 父节点 FROM dual UNION ALL
SELECT '0101010203' 子节点,5 子节点等级,'01010102' 父节点 FROM dual UNION ALL
SELECT '01010103' 子节点,4 子节点等级,'010101' 父节点 FROM dual UNION ALL
SELECT '01010104' 子节点,4 子节点等级,'010101' 父节点 FROM dual UNION ALL
SELECT '0101010401' 子节点,5 子节点等级,'01010104' 父节点 FROM dual UNION ALL
SELECT '0101010402' 子节点,5 子节点等级,'01010104' 父节点 FROM dual )
SELECT tab.*,
SYS_CONNECT_BY_PATH(子节点, '/') "PATH",
regexp_substr(SYS_CONNECT_BY_PATH(子节点, '/'),'[^/]+',1,4),
regexp_substr(SYS_CONNECT_BY_PATH(子节点, '/'),'[^/]+',1,3),
regexp_substr(SYS_CONNECT_BY_PATH(子节点, '/'),'[^/]+',1,2),
regexp_substr(SYS_CONNECT_BY_PATH(子节点, '/'),'[^/]+',1,1)
FROM tab
START WITH 父节点='-1'
CONNECT BY PRIOR 子节点 = 父节点;