在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。 在查询中,可以使用伪列LEVEL显示每行数据的有关层次。LEVEL将返回树型结构中当前节点的层次,我们可以使用LEVEL来控制对树型结构进行遍历的深度。楼主的语句可以改成: select level,id,parent_id,ratio from table start with id ='A' connect by prior id = parent_id 看一下level伪列的就知道是什么意思了
哦,看来我举的这个例子有问题,有点巧合,我把例子换一下比如 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
有错了,sorry,是父级的add_ratio*本级的ratio得到本级的add_ratio
那更简单 就是自连接了: 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
重新整理一下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)
是自连接了: 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
再重新整理一下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)
--我只能做到如下的情况 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
在查询中,可以使用伪列LEVEL显示每行数据的有关层次。LEVEL将返回树型结构中当前节点的层次,我们可以使用LEVEL来控制对树型结构进行遍历的深度。楼主的语句可以改成:
select level,id,parent_id,ratio
from table
start with id ='A'
connect by prior id = parent_id
看一下level伪列的就知道是什么意思了
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
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
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)
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
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)
比如E.add_ratio*G.ratio= 8*6中的8本身来源与C.add_ratio*E.ratio= 2*4这个计算这里就有了问题因为8必须等2*4来算而8*6和2*4又是同时计算的:)
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