SQL переводит данные таблицы в более компактную форму - PullRequest
3 голосов
/ 19 марта 2012

У меня есть таблица с парами данных, смоделированная следующим образом:

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 Ответ

3 голосов
/ 19 марта 2012
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...