![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
create table #Temp(id int ,pid int, val int,isEnd bit)
insert #Temp (id,pid,val,isEnd) values(10,0,0,0)
insert #Temp (id,pid,val,isEnd) values(1,10,0,0)
insert #Temp (id,pid,val,isEnd) values(2,1,0,0)
insert #Temp (id,pid,val,isEnd) values(3,1,1,1)
insert #Temp (id,pid,val,isEnd) values(4,2,0,0)
insert #Temp (id,pid,val,isEnd) values(5,10,2,1)
insert #Temp (id,pid,val,isEnd) values(6,4,3,1)
insert #Temp (id,pid,val,isEnd) values(7,4,4,1)
select * from #Temp
create table #T(id int,pid int )
insert #T(id,pid)
select id,pid from #Temp where isEnd=1
update a set a.val =b.val
from
#Temp a,(select d.pid,sum(val) val from #Temp d group by d.pid) b
where a.id=b.pid
while(@@ROWCOUNT>0)
begin
update a set a.val =b.val
from
#Temp a,(select d.pid,sum(val) val from #Temp d group by d.pid) b
where a.id=b.pid
insert #T(id,pid)
select a.id,a.pid
from
#Temp a
join
#T b
on
a.id=b.pid
left join
#T c
on
c.id=a.id
where c.id is null
end
select * from #Temp
drop table #Temp
drop table #t