Đề xuất của Podiluska là tốt. Nếu bạn có Oracle 11g R2, các biểu thức bảng thông thường là cách để đi. Bản chất đệ quy của cú pháp mới sẽ cho phép bạn loại bỏ sys_connect_by_path
kết hợp với instr
, điều này sẽ ảnh hưởng nghiêm trọng đến hiệu suất của bạn.
Hãy thử điều này:
select
child,
sum(total_quantity) total_quantity
from (
with h (parent, child, isleaf, quantity, total_quantity) as (
select
parent,
child,
isleaf,
quantity,
quantity total_quantity
from
itemhier
where
parent = 'ASSY001'
union all
select
ih.parent,
ih.child,
ih.isleaf,
ih.quantity,
ih.quantity * h.total_quantity total_quantity
from
itemhier ih
join
h on h.child = ih.parent
)
select * from h
where isleaf = 1
)
group by child;
Đây là sqlfiddle: http://sqlfiddle.com/#!4/9840f/6