Добрый день, elijah eliasum!
Вы все правильно двигаетесь, только в обратную сторону, начиная с листьев.
Воспользуйтесь системными полями sys_connect_by_path, sys_connect_by_root
и после аналитическими функциями Оракла sum() over(), row_number() over()
примерно так:
select *
from (
select sum(quantity) over (partition by path_) quantity,
row_number() over (partition by path_) rn
--,h.*, p.*, r.*
from (
SELECT cid, par_cid, rname,
sys_connect_by_path(cid,'/') path_,
sys_connect_by_root(cid) product_cid
FROM catalog
START WITH cid in (
-- возможно есть способ определить листья
-- без использования дополнительного вызова
select distinct rcid from products
)
CONNECT BY PRIOR par_cid = cid
) h
join products p on (h.product_cid = p.rcid)
join records r ...
)
where rn = 1