SQL revisando los datos de la tabla a una forma más compacta

Tengo una tabla con pares de datos modelados de la siguiente manera:

Id1 Id2 ----------- 100 50 120 70 70 50 34 20 50 40 40 10 

Id1 siempre es más grande que Id2 . Los pares representan reemploops a realizar. Entonces 100 será reemplazado por 50, pero luego 50 serán reemplazados por 40, que luego serán reemplazados por 10.

Entonces el resultado sería así:

 Id1 Id2 ----------- 100 10 120 10 34 20 

¿Hay alguna manera bonita y concisa que pueda alterar o unirme a esta tabla para representar esto?

Sé que puedo unirme a él en algo parecido a:

 SELECT t1.Id1, t2.Id2 FROM mytable t1 JOIN myTable t2 ON t2.Id1 = t1.Id2 

Pero esto requerirá varios pases, por lo tanto, ¿por qué me pregunto si existe una forma más agradable de lograrlo?

 declare @t table(Id1 int, Id2 int) insert @t values (100, 50) insert @t values ( 120, 70) insert @t values ( 70, 50) insert @t values ( 34, 20) insert @t values ( 50, 40) insert @t values ( 40, 10) ;with a as ( -- find all rows without parent <*> select id2, id1 from @tt where not exists (select 1 from @t where t.id1 = id2) union all -- recusive work down to lowest child while storing the parent id1 select t.id2 , a.id1 from a join @tt on a.id2 = t.id1 ) -- show the lowest child for each row found in <*> select id1, min(id2) id2 from a group by id1 

Resultado:

 id1 id2 ----------- ----------- 34 20 100 10 120 10