表内同如下:字段A是字段B的父节点
字段B是字段C的父节点
字段C是字段D的父节点字段A    字段B    字段C    字段D
1        2      3        a
1        2      3        b
1        2      4        c
1        2      4        d
1        2      4        e
1        3      5        o
1        3      5        p
1        3      5        l
2        6      7        a
2        6      8        b
要求查出的结果如下: 1  2
1  2  3
1  2  3  a
1  2  3  b
1  2  4 
1  2  4  c
1  2  4  d
1  2  4  e
1  3
1  3  5
1  3  5  o
1  3  5  p
1  3  5  l
2  6
2  6  7
2  6  7  a
2  6  8
2  6  8  b
  求助各位,这种层次查询有没有什么好的方法 

解决方案 »

  1.   

    要是我就用union拉倒
    select * from(
    select a,b,' ' as c,' ' as d from tbl group by a,b
    union all
    select a,b, c,' ' as d from tbl group by a,b,c
    unoin all
    select a,b,c,d from tbl)
    order by a,b,c,d
      

  2.   

    SQL> select * from tb;A  B  C  D                                                                      
    -- -- -- --                                                                     
    1  2  3  a                                                                      
    1  2  3  b                                                                      
    1  2  4  c                                                                      
    1  2  4  d                                                                      
    1  2  4  e                                                                      
    1  3  5  o                                                                      
    1  3  5  p                                                                      
    1  3  5  l                                                                      
    2  6  7  a                                                                      
    2  6  8  b                                                                      已选择10行。SQL> select distinct a,b,null,null from tb
      2  union all
      3  select distinct a,b,c,null from tb
      4  union all
      5  select distinct a,b,c,d from tb
      6  order by 1,2,3 nulls first,4 nulls first;A  B  NU NU                                                                     
    -- -- -- --                                                                     
    1  2                                                                            
    1  2  3                                                                         
    1  2  3  a                                                                      
    1  2  3  b                                                                      
    1  2  4                                                                         
    1  2  4  c                                                                      
    1  2  4  d                                                                      
    1  2  4  e                                                                      
    1  3                                                                            
    1  3  5                                                                         
    1  3  5  l                                                                      
    1  3  5  o                                                                      
    1  3  5  p                                                                      
    2  6                                                                            
    2  6  7                                                                         
    2  6  7  a                                                                      
    2  6  8                                                                         
    2  6  8  b                                                                      已选择18行。
      

  3.   

    select  distinct a,b,null,null  from tbl t connect by a = prior b
    union
    select  distinct a,b,c,null  from tbl t  connect by b = prior c
    union
    select  distinct a,b,c,d  from tbl t  connect by c = prior d;
      

  4.   

    我觉得3楼的方法很好啊, 我加的connect by c = prior d 反而有些多此一举了,呵呵.
    一般这样的表应该只需要两个字段 父节点和子节点,前三个字段是可以写进一个字段的.
     难道楼主给的表就是一个已经处理过一次的? 
    不知道楼主想要什么样的方法?
    根据你给的 字段A是字段B的父节点 
    字段B是字段C的父节点 
    字段C是字段D的父节点  这样的规律  三楼的方法我觉得就是最好的了!