Check this query:
;
with A as
(
select ZpartId
from #LifeCycleMaster as m
inner join #acceptedvalues as v on v.acceptedvaluesid = m.Zlc
where v.acceptedvaluesname = 'Active'
),
O as
(
select ZpartId
from #LifeCycleMaster as m
inner join #acceptedvalues as v on v.acceptedvaluesid = m.Zlc
where v.acceptedvaluesname = 'Obsolete'
),
T as
(
select PartIDX as active_id, *, 1 as [level]
from #Replacement
where PartIDX in (select * from A)
union all
select t.active_id, r.*, t.[level] + 1
from #Replacement as r
inner join T on T.PartIDC = r.PartIDX
where r.PartIDX in (select * from O)
)
select t1.PartIDC, t1.active_id as PartIDX
from T as t1
left join T as t2 on t2.active_id = t1.active_id and t2.[level] = t1.[level] + 1
where t2.active_id is null
option (maxrecursion 197)