我所做过的情况:
所有的数据都是存在末级节点上面的,然后查询的时候要求父节点要显示子集的合计
图一显示末级上面的数据
图二显示父节点的值 可以看出父级节点的值是子集的合计
情况就是这样下面给出一个demo,在数据库执行以下就可以看出来该怎么做了
create table t
(id number,
parent_id number,
value number);
insert into t values(1,0,0);
insert into t values(2,1,0);
insert into t values(3,1,0);
insert into t values(4,2,100);
insert into t values(5,3,200);
commit;
select * from t order by id asc;
关键语句:
with ttt as
(select t.*, SYS_CONNECT_BY_PATH(id, '/') || '/' path
from t
start with t.parent_id = 0
connect by prior t.id = t.parent_id)
SELECT id,
parent_id,
value,
(SELECT SUM(value) FROM ttt WHERE path like t1.path || '%') s_value
FROM ttt T1;
可以看出已经将所有的节点的数据都查出来了
接下就可以挑出父节点的数据,将他更新到父节点数据上,更新的时候可以使用merge into语法这样比较高效。
注意:
每次计算时需要先把原来父节点上面的数据清掉,再从末级汇总上来,要不然计算的结果会包含原来父节点的值