1

重複の可能性:
CTE を使用した実際の再帰?

次の列を持つ Employee テーブルなど、それ自体を参照する階層テーブルがあるとします。

Table      Employee
    Column Id INT NOT NULL
    Column ParentId INT NOT NULL (references Id)
    Column Name NVARCHAR(60) NOT NULL

次のクエリは、特定の EmployeeId をルートとするすべてのレコードを取得します。

DECLARE @EmployeeId INT = <%insert EmployeeId here%>;

WITH CDE AS
(
    SELECT
        *,
        0 AS Level
    FROM
        collaboration.Employee AS E
    WHERE
        Id = @EmployeeId
    UNION ALL
    SELECT
        E.*,
        CDE.Level + 1 AS Level
    FROM
        collaboration.Employee AS E
        INNER JOIN
        CDE ON E.ParentId = CDE.Id AND E.Id <> 0
)
SELECT DISTINCT
    CDE.*
FROM
    CDE
ORDER BY
    CDE.Level

私が望むのは、「ブランチ」でソートしてから「レベル」でソートできるようにすることです。したがって、次の表が与えられます。

1    0    John Smith
2    1    John Doe
3    1    Jane Williams
4    2    Ian Bond
5    2    James Fleming

結果を次のようにしたいと思います。

1    0    John Smith
2    1    John Doe
4    2    Ian Bond
5    2    James Fleming
3    1    Jane Williams

並べ替えを容易にするために文字列を構築する必要のないソリューションが必要です。解決できない場合は、その理由を知りたいです。

4

1 に答える 1

2
;WITH CDE AS 
( 
    SELECT 
        *, 
        0 AS Level,
        convert(nvarchar(50),id) as EPath
    FROM 
        collaboration.Employee AS E 
    WHERE 
        Id = @EmployeeId 
    UNION ALL 
    SELECT 
        E.*, 
        CDE.Level + 1 AS Level ,
        convert(nvarchar(50),Epath+'/'+CONVERT(nvarchar(5),e.id))
    FROM 
        collaboration.Employee AS E 
        INNER JOIN 
        CDE ON E.ParentId = CDE.Id AND E.Id <> 0 
) 
SELECT DISTINCT 
    CDE.* 
FROM 
    CDE 
ORDER BY 
    EPath

ちなみに、SQL Server 2008 には、HierarchyIDまさにこの種のデータ型があります。

于 2012-08-31T11:38:09.317 に答える