刚帮人写的一个sql,你可以借鉴一下。。 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 子节点 = 父节点;
刚帮人写的一个sql,你可以借鉴一下。。 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 子节点 = 父节点;层次查询加正则表达,话说我到现在都没有掌握oracle的正则,其次,效率也比较低
刚帮人写的一个sql,你可以借鉴一下。。 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 子节点 = 父节点;层次查询加正则表达,话说我到现在都没有掌握oracle的正则,其次,效率也比较低 低在哪里?
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 子节点 = 父节点;
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 子节点 = 父节点;层次查询加正则表达,话说我到现在都没有掌握oracle的正则,其次,效率也比较低
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 子节点 = 父节点;层次查询加正则表达,话说我到现在都没有掌握oracle的正则,其次,效率也比较低
低在哪里?