2016-07-05 5 views
0

У меня есть таблица SQL с родителем и информацией ребенка, какПолучение окончательный родитель в таблице иерархии

child parent 
--------------- 
    a  b 
    b  c 
    c  d 
    e  f 

Мой результат должен быть как

child parent 
--------------- 
    a  d 
    b  d 
    c  d 
    e  f 

Каждая строка должна иметь ребенка и его окончательного родителя в его иерархия.

Как это сделать на SQL Server?

+0

'Какие РСУБД это для? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

+0

Если вы используете СУБД, которая поддерживает [современный SQL] (http://modern-sql.com/slides), вы можете использовать рекурсивное общее табличное выражение. Проверьте решение, помеченное тегом [tag: recursive-query] –

+0

Я использую сервер sql –

ответ

0

Да, это можно сделать с помощью рекурсивного CTE. Это образец.

declare @tbl table(child varchar(5), parent varchar(5)) 
insert @tbl values 
    ('a',  'b'), 
    ('b',  'c'), 
    ('c',  'd'), 
    ('e',  'f') 

    ;with tbl as (
    --anchor query 
    --find starting level 
    select parent child, parent parent, 0 lvl 
    from @tbl t 
    where parent not in (select child from @tbl) 
    union all 
    --recursive query 
    select t.child, tbl.parent, lvl+1 --keep top level parent 
    from @tbl t 
    inner join tbl on t.parent=tbl.child --go up the tree to previous level 
) 
    --filter final results 
    select child,parent from tbl 
    where lvl>0 --lvl 0 is fake level 
    order by child 
+0

Большое вам спасибо –

Смежные вопросы