2011-03-03 13 views
5

現在、CTEクエリを実行して、ほとんどの再帰的な例と同様の従業員テーブルから従業員階層を再帰的に構築しています。私が立ち往生しているところでは、私は単一の従業員を照会し、彼の上の階層を取得しようとしています。私はこだわっていますSQL CTE再帰:親レコードを返す

with employeeMaster as (
    select p.EmployeeID, p.MgrID, p.Name 
    from Employees p 
    where p.MgrID is null 

    union all 

    select c.EmployeeID, c.MgrID, c.Name 
    from employeeMaster cte inner join Employees c on c.MgrID = cte.EmployeeID 
) 
select * from employeeMaster 

は次のとおりです。

Employees 
=========================================================================== 
EmployeeID MgrID Name 
1    null  Joe 
2    1  John 
3    2  Rob 
4    2  Eric 

次は私が上から下の階層を表示することを可能にするSQLは、次のとおりです。して、以下に私が仕事にしようとしているテーブルの例があります最下位レベルの従業員(RobまたはEric)を照会する方法を理解しておらず、Joe> John> Ericから彼の上の階層を返すことはできません。これは簡単にできるはずだが、私の人生ではそれを見つけられないようだ。

答えて

8

階層の深さに応じて、可変数の列を返すクエリを探していますか?または、1つのフィールドに連結された文字列だけですか?

ここでは、Ericとその上の誰かを階層内で取得するクエリのマイナーチェンジがあります。

WITH employeeMaster 
     AS (SELECT p.EmployeeID , 
        p.MgrID , 
        p.NAME 
      FROM  Employees p 
      WHERE p.NAME = 'Eric' 
      UNION ALL 
      SELECT c.EmployeeID , 
        c.MgrID , 
        c.NAME 
      FROM  employeeMaster cte 
        INNER JOIN Employees c ON c.EmployeeID = cte.MgrID 
     ) 
SELECT * 
FROM employeeMaster m 
+0

私のポストでは、テーブルの例を使用して、私はEricを照会し、彼のレコードと彼の上の2人を示す3つのレコードでレコードセットを返したいと思います。最終的な目標は、あらゆる従業員の欲望を問うことであり、その従業員の連鎖が一番上に向かうのを見ています。 – Tehrab

+0

私はあなたにエリックと彼のマネージャーを与えるために編集しました。 –

+0

常に簡単なもの。回答としてマーク。 – Tehrab