CTE для построения списка отделов и руководителей (иерархический) - PullRequest
2 голосов
/ 21 мая 2010

Мне нужно создать список пользователей, которые являются менеджерами или менеджерами менеджеров, для отделов компании.

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

CREATE TABLE [dbo].[Manager](
[ManagerId] [int],
[ParentManagerId] [int])

CREATE TABLE [dbo].[Department](
[DepartmentId] [int],
[ManagerId] [int])

По сути, я пытаюсь создать CTE, который даст мне список DepartmentIds вместе со всеми ManagerIds, которые находятся в иерархии менеджеров для этого отдела.

Итак ... Скажем, Менеджер 1 является менеджером для отдела 1, а Менеджер 2 является менеджером менеджера 1, а Менеджер 3 является менеджером менеджера 2, я бы хотел видеть:

DepartmentId, ManagerId
1, 1
1, 2
1, 3

По сути, менеджеры могут иметь дело со всеми отделами своих заместителей.

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

WITH DepartmentManagers
AS
(
    SELECT      ManagerId,
                ParentManagerId,
                0 AS Depth
    From        Manager

    UNION ALL

    SELECT      Manager.ManagerId,
                Manager.ParentManagerId,
                DepartmentManagers.Depth + 1 AS Depth
    FROM        Manager
    INNER JOIN  DepartmentManagers
                ON DepartmentManagers.ManagerId = Manager.ParentManagerId
)

Мне нужен список всех департаментов вместе со всеми связанными с ними менеджерами.

Может кто-нибудь помочь?

1 Ответ

1 голос
/ 21 мая 2010

Измените свой якорный запрос:

WITH    DepartmentManagers
        AS
        (
        SELECT  d.DepartmentID,
                d.ManagerId,
                m.ParentManagerId
                0 AS Depth
        FROM    Department d
        JOIN    Manager m
        ON      m.ManagerID = d.managerID
        WHERE   DepartmentID = 1
        UNION ALL
        SELECT  d.DepartementID,
                m.ManagerId,
                m.ParentManagerId,
                d.Depth + 1
        FROM    DepartmentManagers d
        JOIN    Manager m
        ON      m.ManagerId = d.ParentManagerID
        )
...