Вам необходимо использовать рекурсив CTE для идентификации нового родителя. Сначала вы выбираете детей, не являющихся «NO_», родители которых являются «NO_». Из них вы должны двигаться вверх по иерархии, пока не найдете не родителя NO_. Для этого я использовал дополнительный столбец NEW_PARENT_FOUND.
Вот запрос, который можно легко преобразовать в обновление.
<!-- language: lang-sql -->
declare @vBOM table (PARENT varchar(20), CHILD varchar(20))
insert into @vBOM( PARENT, CHILD )
values
('C002584', 'NO_CRT874')
, ('NO_CRT874', 'F8745')
, ('NO_CRT874', 'IY845')
, ('NO_CRT874', 'YRF522')
, ('C002584', 'NO_UYTRR')
, ('NO_UYTRR', 'NO_UYT953')
, ('NO_UYT953', 'FEWF845')
, ('C002584', '95659I')
, ('C002584', '84666E')
; with cteNewParent as
(select B.CHILD, B.PARENT NEW_PARENT, 0 NEW_PARENT_FOUND
from @vBOM B
where B.CHILD not like 'NO_%' and B.PARENT like 'NO_%'
union all
select NP.CHILD, B.PARENT NEW_PARENT, iif(NP.CHILD not like 'NO_%' and B.PARENT not like 'NO_%', 1, 0) NEW_PARENT_FOUND
from cteNewParent NP inner join @vBOM B on B.CHILD = NP.NEW_PARENT
where NP.NEW_PARENT_FOUND = 0
)
select NP.CHILD, NP.NEW_PARENT, NP.NEW_PARENT_FOUND, B.PARENT, B.CHILD
from cteNewParent NP inner join @vBOM B on B.CHILD = NP.CHILD
where NP.NEW_PARENT_FOUND = 1