SQL CTE Recursion: возвращение родительских записей - PullRequest
5 голосов
/ 04 марта 2011

В настоящее время я выполняю запрос 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

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

1 Ответ

8 голосов
/ 04 марта 2011

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

Вот небольшое изменение в вашем запросе, которое приведет Эрика и кого-либо выше него в иерархию.

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
...