Как использовать CTE для сопоставления родительско-дочерних отношений? - PullRequest
3 голосов
/ 19 января 2010

Допустим, у меня есть таблица элементов, представляющих древовидные структурированные данные, и я хотел бы непрерывно отслеживать вверх, пока не доберусь до верхнего узла, отмеченного parent_id NULL. Как будет выглядеть мой MS SQL CTE (общее табличное выражение)?

Например, если бы я получил путь к вершине от Бендер , это выглядело бы как

Comedy

Футурама

Bender

Спасибо, и вот пример данных:

DECLARE @t Table(id int, description varchar(50), parent_id int)

INSERT INTO @T 
SELECT 1, 'Comedy', null UNION 
SELECT 2, 'Futurama', 1 UNION
SELECT 3, 'Dr. Zoidberg', 2 UNION 
SELECT 4, 'Bender', 2 UNION
SELECT 5, 'Stand-up', 1 UNION
SELECT 6, 'Unfunny', 5 UNION
SELECT 7, 'Dane Cook', 6

1 Ответ

4 голосов
/ 19 января 2010

должно выглядеть так:

declare @desc varchar(50)
set @desc = 'Bender'

;with Parentage as
(
    select * from @t where description = @desc
    union all

    select t.* 
    from @t t
    inner join Parentage p
        on t.id = p.parent_id
)
select * from Parentage
order by id asc --sorts it root-first 
...