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 子节点 = 父节点; 大神啊效果确实是这样的,但是我想再问下,为啥出来的数据有大量的重复情况,是不是我只能通过distinct去重?
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 子节点 = 父节点; 大神啊效果确实是这样的,但是我想再问下,为啥出来的数据有大量的重复情况,是不是我只能通过distinct去重? 从多个根节点的时候会出现重复,是connect by导致的,可以通过distinct处理。
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 子节点 = 父节点; 大神啊效果确实是这样的,但是我想再问下,为啥出来的数据有大量的重复情况,是不是我只能通过distinct去重? 从多个根节点的时候会出现重复,是connect by导致的,可以通过distinct处理。 在问一下,我这个父子关系表大约有9000行,按照这个语句,distinct去重后,效率很低,运行了一晚上,完全没办法插入到另一张表里面,甚至select distinct出不来数据,是否有更高效的方式,谢谢
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 子节点 = 父节点;
大神啊效果确实是这样的,但是我想再问下,为啥出来的数据有大量的重复情况,是不是我只能通过distinct去重?
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 子节点 = 父节点;
大神啊效果确实是这样的,但是我想再问下,为啥出来的数据有大量的重复情况,是不是我只能通过distinct去重?
从多个根节点的时候会出现重复,是connect by导致的,可以通过distinct处理。
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 子节点 = 父节点;
大神啊效果确实是这样的,但是我想再问下,为啥出来的数据有大量的重复情况,是不是我只能通过distinct去重?
从多个根节点的时候会出现重复,是connect by导致的,可以通过distinct处理。
在问一下,我这个父子关系表大约有9000行,按照这个语句,distinct去重后,效率很低,运行了一晚上,完全没办法插入到另一张表里面,甚至select distinct出不来数据,是否有更高效的方式,谢谢