楼主使用oracle的connect by和sys_connect_by_path,具体怎么实现,还希望楼主自学一下,比较简单。

解决方案 »

  1.   

    刚帮人写的一个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 子节点 = 父节点;
      

  2.   

    刚帮人写的一个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的正则,其次,效率也比较低
      

  3.   

    刚帮人写的一个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的正则,其次,效率也比较低
    低在哪里?