2012-08-31 63 views
1

可能重複:
A real recursion with CTE?如何使用公用表表達式SQL Server中分層排序

鑑於分層表引用本身,如具有下列列的Employee表:

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

以下查詢會給我所有記錄r ooted在一個給定的僱員:

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 

我想,不涉及建立字符串,方便整理的解決方案。如果解決方案不可行,我想知道爲什麼。

+0

@MikaelEriksson,你是對的,它有點相同的問題,但我有一個額外的問題,這就是當我在本例中使用'INT'作爲Id列時,在真實情況下'UNIQUEIDENTIFIER'正在被使用,另一個例子會很快處理非常大的字符串。我想要一個解決方案,不需要建立字符串值來進行排序。 –

+2

我想要一輛法拉利。如果您有一個特定的解決方案,最好告訴我們一開始是什麼,或至少編輯您的問題,以表明願意花時間解決您的問題的任何人 – podiluska

回答

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數據類型。

+0

謝謝。請參閱我上面有關我正在尋找的解決方案的評論。 –

+0

此外,使用HierarchyID目前不是一個選項。 –

+0

@UmarFarooqKhawaja任何*其他*要求?除了不使用字符串,也不使用正確的數據類型,那是? – podiluska

相關問題