You can use a cte
to do it;
WITH cte(sub,val,par,chil, lev) AS (
SELECT s.sub, s.val, p.par, p.chil, 1
FROM subval s LEFT JOIN parchil p ON s.sub=p.par
UNION ALL
SELECT s.sub, s.val+c.val, p.par, p.chil, lev + 1
FROM subval s LEFT JOIN parchil p ON s.sub=p.par
JOIN cte c ON c.sub=p.chil
)
SELECT c1.sub,c1.val FROM cte c1
LEFT JOIN cte c2
ON c1.sub=c2.sub
AND c1.lev < c2.lev
WHERE c2.sub IS NULL
ORDER BY sub;
...or you can use a regular hierarchical query;
SELECT root, SUM(val) val
FROM
(
SELECT CONNECT_BY_ROOT sub root, val
FROM subval s
LEFT JOIN parchil p ON s.sub = p.par
CONNECT BY sub = PRIOR chil
)
GROUP BY root
ORDER BY root