从同一个表中选择父级和子级

时间:2011-11-13 13:15:39

标签: sql-server-2005 correlated-subquery

我有一张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)

我想在select语句中列出员工姓名及其经理姓名。

我现在正在做的是创建一个临时表,其中包含所有经理名称及其ID。

然后根据Id获取经理表中的名称。

但我知道这不是一个正确的方法,事实上它很复杂。

2 个答案:

答案 0 :(得分:1)

你是对的:你不必为此使用临时表。尝试使用递归查询。 Take a look at this link on MSDN。 ManagerId / EmployeeID有一个例子。就像在您的查询中一样。

答案 1 :(得分:1)

您应该使用递归CTE(公用表表达式):

-- 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
相关问题