drop table dbo.testing create table dbo.testing (retained int, dropped int)insert into dbo.testing (retained, dropped)select 767884, 157441 union allselect 1046261, 157441 union allselect 6699, 157441 union allselect 157441, 73635 union allselect 767884, 73635 union allselect 1046261, 73635 union allselect 6699, 73635 union allselect 1046261, 767884 union allselect 6699, 767884 union allselect 6699, 1046261
;WITH retained AS ( SELECT t.* FROM testing t WHERE NOT EXISTS (SELECT 1 FROM testing i WHERE i.dropped = t.retained))SELECT [Level] = 1, l1.retained, l1.droppedFROM retained l1UNION ALLSELECT [Level] = 2, l1.retained, l2.retainedFROM retained l1inner JOIN testing l2 ON l2.retained = l1.droppedUNION ALLSELECT [Level] = 3, l1.retained, l3.retainedFROM retained l1inner JOIN testing l2 ON l2.retained = l1.droppedinner JOIN testing l3 ON l3.retained = l2.droppedUNION ALLSELECT [Level] = 4, l1.retained, l3.droppedFROM retained l1inner JOIN testing l2 ON l2.retained = l1.droppedinner JOIN testing l3 ON l3.retained = l2.dropped
;WITH retained AS (SELECT t.retained, dropped FROM testing t WHERE NOT EXISTS (SELECT 1 FROM testing i WHERE i.dropped = t.retained) UNION ALL SELECT b.retained, t1.dropped FROM testing AS t1 INNER JOIN retained as b ON t1.retained = b.dropped) UPDATE t SET t.retained = uv.retained FROM testing t INNER JOIN retained uv ON t.dropped = uv.dropped
with rCTE as (select t1.retained, t1.dropped, t1.retained as TopLevelfrom dbo.testing t1 left outer join dbo.testing t2 on t1.retained = t2.droppedwhere t2.dropped is nullunion allselect t1.retained, t1.dropped, r.TopLevelfrom dbo.testing t1inner join rCTE r on t1.retained = r.dropped)update tu set retained = r.TopLevelfrom dbo.testing tu inner join rCTE r on tu.retained = r.retained and tu.dropped = r.dropped;
with rCTE as (select t1.retained, t1.dropped, t1.retained as TopLevelfrom dbo.testing t1 left outer join dbo.testing t2 on t1.retained = t2.droppedwhere t2.dropped is nullunion allselect t1.retained, t1.dropped, r.TopLevelfrom dbo.testing t1 inner join rCTE r on t1.retained = r.dropped)update tu set retained = r.TopLevelfrom dbo.testing tu inner join rCTE r on tu.retained = r.retained and tu.dropped = r.dropped;
;WITH rCTE AS ( SELECT [level] = 1, t1.retained, t1.dropped, --fullchain = CAST(CAST(t1.retained AS VARCHAR(10)) + ',' + CAST(t1.dropped AS VARCHAR(10)) AS VARCHAR(8000)), Toplevel = t1.retained FROM dbo.testing t1 LEFT OUTER JOIN dbo.testing t2 ON t1.retained = t2.dropped WHERE t2.dropped IS NULL UNION ALL SELECT [level] = [level] + 1, t1.retained, t1.dropped, --fullchain = r.fullchain + ',' + CAST(t1.dropped AS VARCHAR(10)), Toplevel = r.Toplevel FROM dbo.testing t1 INNER JOIN rCTE r ON t1.retained = r.dropped)--SELECT * --FROM rCTE--ORDER BY level, droppedUPDATE tu SET retained = r.TopLevelFROM dbo.testing tu INNER JOIN rCTE r ON tu.dropped = r.dropped;SELECT * FROM dbo.testing