SQL将表数据修改为更紧凑的形式

时间:2012-03-19 04:06:46

标签: sql sql-server sql-server-2008 tsql

我有一个数据对的表格如下所示:

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

但这需要多次通过,因此我问为什么有更好的方法来实现它?

1 个答案:

答案 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