2011-11-13 9 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) 

を挿入selectステートメント。

私がやっていることは、すべてのマネージャー名とその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

感謝を。一方、私はこれを書いて、あなたが私が間違っている場所に電話してください。 セレクトE(EMPどこEMPID IN(EMPからマネージャーIDを選択) からDISTINCT EMPID、のempName を選択 ) AS ManagerInfo(EMPID、のempName) WITH **私はちょうどCTEについて読んだことがある、これは私の試み です。 EmpName、MI.EmpName EmpからINNER JOIN ManagerInfo MI ** – Zerotoinfinity

+0

@Zerotoinfinite:あなたのCTEは再帰的ではありません.... –

+0

どのように再帰的にすることができますか? – Zerotoinfinity

1

あなたは正しいです:これのために一時テーブルを使う必要はありません。再帰的なクエリを使用してみてください。 Take a look at this link on MSDN。 ManagerId/EmployeeIDの例があります。あなたの質問と同じように。

関連する問題