CREATE TABLE TEST_P(ID INT,NAME VARCHAR2(10),VAL INT,PARENTID INT)
;
INSERT INTO TEST_P
SELECT 1 ,'w1', 0 , 0 FROM DUAL UNION ALL
SELECT 2 ,'w2', 2 , 1 FROM DUAL UNION ALL
SELECT 3 ,'w3', 3 , 1 FROM DUAL UNION ALL
SELECT 4 ,'w4', 4 , 2 FROM DUAL;
UPDATE TEST_P T1
SET T1.VAL = (SELECT DECODE(SUM(VAL), NULL, T1.VAL, SUM(VAL))
FROM TEST_P T2
WHERE T2.ID <> T1.ID
AND CONNECT_BY_ISLEAF = 1
START WITH T2.ID = T1.ID
CONNECT BY PRIOR T2.ID = T2.PARENTID);
commit;
select * from TEST_P;