通过start with connect by我已经可以拿到树的结构,但是我想得到结果的累计怎么处理?
比如 
id,parent_id,ratio
A, B, 2
A, C, 3
B, D, 2
C, E, 2我希望得到 
id,parent_id,ratio,add_ratio
A, B, 2 , 2
A, C, 3 , 3
B, D, 2 , 4
C, E, 2 , 6
这个有办法实现吗?

解决方案 »

  1.   

    能不能具体写一下,不是很明白,感觉和level没什么关系,多谢!
      

  2.   

    add_ratio列的来源依据是什么?
      

  3.   

    在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。
    在查询中,可以使用伪列LEVEL显示每行数据的有关层次。LEVEL将返回树型结构中当前节点的层次,我们可以使用LEVEL来控制对树型结构进行遍历的深度。楼主的语句可以改成:
    select level,id,parent_id,ratio
    from   table
    start with id ='A'
    connect by prior id = parent_id
    看一下level伪列的就知道是什么意思了
      

  4.   

    哦,看来我举的这个例子有问题,有点巧合,我把例子换一下比如 
    id,parent_id,ratio
    A, B, 2
    A, C, 3
    B, D, 2
    C, E, 3我希望得到 
    id,parent_id,ratio,add_ratio
    A, B, 2 , 2
    A, C, 3 , 3
    B, D, 2 , 4
    C, E, 3 , 9也就是说父级的ratio*本级的ratio得到本级的add_ratio
      

  5.   

    有错了,sorry,是父级的add_ratio*本级的ratio得到本级的add_ratio
      

  6.   

    那更简单 就是自连接了:
    SQL> select * from test_tab;ID         SUB_ID            NUM
    ---------- ---------- ----------
    A          B                   2
    A          C                   3
    B          D                   2
    C          E                   3
    ----------------------------
    SQL> select a.id,a.sub_id,a.num*nvl(b.num,1)
      2  from   test_tab a,test_tab b
      3  where a.id =b.sub_id(+)
      4  /ID         SUB_ID     A.NUM*NVL(B.NUM,1)
    ---------- ---------- ------------------
    A          B                           2
    A          C                           3
    B          D                           4
    C          E                           9
      

  7.   

    重新整理一下parent_id,id,ratio
    A, B, 2
    A, C, 3
    B, D, 2
    C, E, 3我希望得到 
    parent_id,id,ratio,add_ratio
    A, B, 2 , 2
    A, C, 3 , 3
    B, D, 2 , 4  (B.add_ratio*D.ratio= 2*2)
    C, E, 3 , 9  (C.add_ratio*E.ratio= 2*2)
      

  8.   

    是自连接了:
    SQL> select * from test_tab;ID         SUB_ID            NUM
    ---------- ---------- ----------
    A          B                   2
    A          C                   3
    B          D                   2
    C          E                   3
    ----------------------------
    SQL> select a.id,a.sub_id,a.num*nvl(b.num,1)
      2  from   test_tab a,test_tab b
      3  where a.id =b.sub_id(+)
      4  /ID         SUB_ID     A.NUM*NVL(B.NUM,1)
    ---------- ---------- ------------------
    A          B                           2
    A          C                           3
    B          D                           4
    C          E                           9
      

  9.   

    再重新整理一下parent_id,id,ratio
    A, B, 1
    A, C, 2
    B, D, 3
    C, E, 4
    D, F, 5 
    E, G, 6
     
    我希望得到 
    parent_id,id,ratio,add_ratio
    A, B, 1 , 1
    A, C, 2 , 2
    B, D, 3 , 3  (B.add_ratio*D.ratio= 1*3)
    C, E, 4 , 8  (C.add_ratio*E.ratio= 2*4)
    D, F, 5 , 15  (D.add_ratio*E.ratio= 3*5)
    E, G, 6 , 48  (E.add_ratio*G.ratio= 8*6)
      

  10.   

    如果你是要这样的查询结果的话就很复杂了 其实你最后的2个数值的计算应该换成 1*3*5=15 和2*4*8=64这个好像有递归的意思
    比如E.add_ratio*G.ratio= 8*6中的8本身来源与C.add_ratio*E.ratio= 2*4这个计算这里就有了问题因为8必须等2*4来算而8*6和2*4又是同时计算的:)
      

  11.   

    是啊,不过oracle树函数本身就是一个递归的功能,不知道oracle有没有其他支持这种计算的方法
      

  12.   

    --我只能做到如下的情况
    SQL> select * from test_tab;ID         SUB_ID            NUM
    ---------- ---------- ----------
    A          B                   1
    A          C                   2
    B          D                   3
    C          E                   4
    D          F                   5
    E          G                   66 rows selectedSQL> 
    SQL> select ID,SUB_ID,NUM ,
      2            LTRIM(sys_connect_by_path(ID,'*') ,'*') PATH,
      3            LTRIM(sys_connect_by_path(NUM,'*'),'*') NUM
      4  FROM test_tab
      5  start with id = 'A'
      6  connect by id = prior sub_id
      7  order by id
      8  /ID         SUB_ID            NUM PATH       NUM
    ---------- ---------- ---------- ---------- ----------
    A          B                   1 A          1
    A          C                   2 A          2
    B          D                   3 A*B        1*3
    C          E                   4 A*C        2*4
    D          F                   5 A*B*D      1*3*5
    E          G                   6 A*C*E      2*4*66 rows selected