Рекурсия SQL CTE: возврат родительских записей

В настоящее время я запускаю запрос CTE для рекурсивного построения иерархии сотрудников из таблицы сотрудников, аналогично тому, что демонстрируют большинство рекурсивных примеров. Где я застрял, так это в том, что я пытаюсь запросить одного сотрудника и получить иерархию над ним. Ниже приведен пример таблицы, с которой я пытаюсь работать:

Employees
===========================================================================
EmployeeID    MgrID    Name
1             null     Joe
2             1        John
3             2        Rob
4             2        Eric

Ниже приведен SQL, который позволяет мне отображать иерархию сверху вниз:

with employeeMaster as (
    select p.EmployeeID, p.MgrID, p.Name
    from Employees p
    where p.MgrID is null

    union all

    select c.EmployeeID, c.MgrID, c.Name
    from employeeMaster cte inner join Employees c on c.MgrID = cte.EmployeeID
)
select * from employeeMaster

Я застрял в том, что не могу понять, как запросить сотрудника самого низкого уровня, Роба или Эрика, и вернуть иерархию над ним из Джо> Джон> Эрик. Кажется, что это должно быть легко, но я не могу понять это на всю жизнь.


person Tehrab    schedule 03.03.2011    source источник


Ответы (1)


Вы ищете запрос для возврата переменного количества столбцов в зависимости от глубины иерархии? Или просто конкатенированная строка в одном поле?

Вот небольшое изменение в вашем запросе, которое позволит получить Эрика и всех вышестоящих в иерархии.

WITH    employeeMaster
      AS ( SELECT   p.EmployeeID ,
                    p.MgrID ,
                    p.NAME
           FROM     Employees p
           WHERE    p.NAME = 'Eric'
           UNION ALL
           SELECT   c.EmployeeID ,
                    c.MgrID ,
                    c.NAME
           FROM     employeeMaster cte
                    INNER JOIN Employees c ON c.EmployeeID = cte.MgrID
         )
SELECT  *
FROM    employeeMaster m
person Jamie F    schedule 03.03.2011
comment
Используя пример таблицы в моем посте, я хотел бы запросить Эрика и вернуть набор записей с тремя записями, показывающими его запись и двух человек над ним. Конечная цель состоит в том, чтобы запросить любого сотрудника и увидеть цепочку подчинения этого сотрудника на всем пути к вершине. - person Tehrab; 04.03.2011
comment
Всегда простые вещи. Отмечено как отвеченное. - person Tehrab; 04.03.2011