2011-11-13 81 views
0

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

我想列出員工的姓名和他們的經理的名字選擇語句。

我現在正在做的是創建一個臨時表,其中包含所有經理姓名和他們的ID。

然後根據ID從管理器表中獲取名稱。

但我知道這不是一個正確的方法,實際上它很複雜。

回答

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 
+0

感謝您的查詢。同時我寫了這個,請問你能告訴我我錯在哪裏。我剛剛讀到CTE,這是我嘗試 ** WITH ManagerInfo(EMPID,empName) AS ( SELECT DISTINCT EMPID,empName FROM EMP其中EMPID IN(從EMP選擇經理ID) ) 選擇e。 EmpName,MI.EmpName FROM Emp e INNER JOIN ManagerInfo MI ** – Zerotoinfinity

+0

@Zerotoinfinite:您的CTE不是遞歸的...... –

+0

如何使它遞歸? – Zerotoinfinity

1

你是對的:你不必爲此只使用臨時表。嘗試使用遞歸查詢。 Take a look at this link on MSDN。 ManagerId/EmployeeID有一個例子。就像在你的查詢中一樣。