根据节点编号规则,依次去除父节点后两位就行了。
5级节点是有1,2,3,4级父节点;4级节点仅有1,2,3级父节点。
依次根据子节点等级去分别update新增的四个列就行了。

解决方案 »

  1.   

    数据量不仅仅是这几条,我图片上的仅仅是个数据片段,数据量太大的时候,update的话,自动性和效率性不太好满足
      

  2.   


    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 子节点 = 父节点;
      

  3.   


    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去重?
      

  4.   


    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处理。
      

  5.   


    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出不来数据,是否有更高效的方式,谢谢