我有一个数据对的表格如下所示:
Id1 Id2
-----------
100 50
120 70
70 50
34 20
50 40
40 10
Id1
总是大于Id2
。这些对表示要进行的替换。所以100将被替换为50,但是50将被替换为40,然后将被替换为10。
所以结果会是这样的:
Id1 Id2
-----------
100 10
120 10
34 20
是否有一种简洁明了的方法可以改变,或者加入此表来代表这个?
我知道我可以加入它本身类似于:
SELECT t1.Id1, t2.Id2
FROM mytable t1
JOIN myTable t2 ON t2.Id1 = t1.Id2
但这需要多次通过,因此我问为什么有更好的方法来实现它?
答案 0 :(得分:3)
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 @t t 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 @t t on a.id2 = t.id1
)
-- show the lowest child for each row found in <*>
select id1, min(id2) id2 from a
group by id1
结果:
id1 id2
----------- -----------
34 20
100 10
120 10