Выберите родителя и ребенка из одной таблицы - PullRequest
0 голосов
/ 13 ноября 2011

У меня есть таблица emp,

    CREATE TABLE [dbo].[Emp](
    [EmpId] [int] NULL,
    [EmpName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [ManagerId] [int] NULL
) ON [PRIMARY]

Теперь вставьте следующие значения в таблицу

   Insert Into Emp Values(1,'A',0)
Insert Into Emp Values(2,'B',1)
Insert Into Emp Values(3,'C',2)
Insert Into Emp Values(4,'D',2)
Insert Into Emp Values(5,'E',4)
Insert Into Emp Values(6,'F',4)
Insert Into Emp Values(7,'G',4)
Insert Into Emp Values(8,'H',6)
Insert Into Emp Values(9,'I',5)
Insert Into Emp Values(10,'J',7)
Insert Into Emp Values(11,'K',4)

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

То, что я сейчас делаю, - это создание временной таблицы со всеми именами менеджера и их идентификатором.

Затем получить имя из таблицы менеджера на основе идентификатора.

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

Ответы [ 2 ]

1 голос
/ 13 ноября 2011

Для этого вы должны использовать рекурсивное CTE (Common Table Expression):

-- define the recursive CTE and give it a name
;WITH Hierarchy AS
(
    -- "anchor" - top-level rows to select, here those with ManagerId = 0
    SELECT EmpId, EmpName, NULL AS 'MgrId', CAST(NULL AS NVARCHAR(50)) AS 'MgrName', 1 AS 'Level'
    FROM dbo.Emp
    WHERE ManagerId = 0

    UNION ALL

    -- recursive part - join an employee to its manager via ManagerId -> mgr.EmpId
    SELECT e.EmpId, e.EmpName, mgr.EmpId, mgr.EmpName, mgr.Level + 1 AS 'Level'
    FROM dbo.Emp e
    INNER JOIN Hierarchy mgr ON e.ManagerId = mgr.EmpId
)
SELECT * FROM Hierarchy
1 голос
/ 13 ноября 2011

Вы правы: вам не нужно использовать временную таблицу только для этого.Попробуйте использовать рекурсивные запросы. Посмотрите эту ссылку на MSDN .Есть пример с ManagerId / EmployeeID.Как и в вашем запросе.

...