Ваш пробег может отличаться, CTE ограничены. Из коробки они допускают только 100 шагов глубиной. (Я думаю, что то же самое касается хранимых процедур)
Но ... если вы действительно хотите рекурсивное решение ... что-то вроде этого может работать. (хотя это не супер эффективно)
Имейте в виду, петли и тому подобное могут бросить это в ход.
with recurse as (
select * from #t
union all
select t2.OldPart, t2.NewPart, t.Demand + t2.Demand as Demand from recurse t
join #t t2 on t.NewPart = t2.OldPart
)
select * from (
select OldPart, '' NewPart ,MAX(Demand) Demand from recurse
where OldPart in (select OldPart from #t where NewPart = '')
group by OldPart
) X
union all
select distinct OldPart, NewPart, 0
from #t
where NewPart <> ''
Результаты:
F 14
M 7
Z 11
A B 0
B C 0
C D 0
D E 0
E F 0
Y Z 0
Ввод:
create table #t (OldPart varchar, NewPart varchar, Demand int)
go
insert #t
select
'C' , 'D' , 3
union all
select
'F' , '' , 1
union all
select
'A' , 'B' , 5
union all
select
'D' , 'E' , 2
union all
select
'E' , 'F' , 0
union all
select
'B' , 'C' , 3
union all
select
'Z' , '' , 1
union all
select
'M' , '' , 7
union all
select
'Y' , 'Z' , 10