1.
pkg_id   child_id  child_parent_id
9001      8003          9001
9002      8004          9002
9003      8019          9003
9003      8018          9003
9003      8017          9003
9003      8016          9003
9018      8078          9018
9018      8014          8078    
9018      8079          9018
9018      8080          8079
9018      8081          9018
9018      8082          8081
9018      8083          8082
9018      8084          8083得到如下结果,(不能有重复)
*9001
**8003*9002
**8004*9003
**8016
**8017
**8018
**8019*9018
**8078
***8014
**8079
***8080
**8081
***8082
****8083
*****8084

解决方案 »

  1.   

    --跟前面那个一样吧
    SQL> desc tt;
    Name            Type    Nullable Default Comments 
    --------------- ------- -------- ------- -------- 
    PKG_ID          CHAR(4) Y                         
    CHILD_ID        CHAR(4) Y                         
    CHILD_PARENT_ID CHAR(4) Y                         
     
    SQL> select * from tt;
     
    PKG_ID CHILD_ID CHILD_PARENT_ID
    ------ -------- ---------------
    9001   8003     9001
    9002   8004     9002
    9003   8019     9003
    9003   8018     9003
    9003   8017     9003
    9003   8016     9003
    9018   8078     9018
    9018   8014     8078
    9018   8079     9018
    9018   8080     8079
    9018   8081     9018
    9018   8082     8081
    9018   8083     8082
    9018   8084     8083
     
    14 rows selected
     
    SQL> 
    SQL> SELECT lpad(child_id, LEVEL + length(child_id), '-')
      2    FROM (SELECT *
      3            FROM tt
      4          UNION ALL
      5          SELECT DISTINCT NULL, pkg_id, NULL FROM tt)
      6   START WITH child_parent_id IS NULL
      7  CONNECT BY PRIOR child_id = child_parent_id
      8   ORDER SIBLINGS BY child_id;
     
    LPAD(CHILD_ID,LEVEL+LENGTH(CHI
    --------------------------------------------------------------------------------
    -9001
    --8003
    -9002
    --8004
    -9003
    --8016
    --8017
    --8018
    --8019
    -9018
    --8078
    ---8014
    --8079
    ---8080
    --8081
    ---8082
    ----8083
    -----8084
     
    18 rows selected
     
    SQL> 
      

  2.   

    SELECT lpad(child_id, LEVEL + length(child_id), '*')
          FROM (SELECT pkg_id,child_id,child_parent_id
                  FROM z
               UNION ALL
                SELECT DISTINCT NULL, pkg_id, NULL FROM z)
         START WITH child_parent_id IS NULL
        CONNECT BY PRIOR child_id = child_parent_id
      ORDER SIBLINGS BY child_id;