1

我有一個名爲Department的表,其中有3列:DepartmentID,DepartmentName,ParentIDORDER BY使用MS SQL Server存儲過程的子父級層次結構

的細節

我要訂購由PARENTID和代結果見SQL Fiddle。像這樣:
╔═════════════════════════════════════════════════════ ════════
║ChildID║DepartmentName║Generation║ParentID║
╠═══════════════════════╠══════════ ══════════╬══════════╣
║1║經理║0║NULL║
║6║銷售║1║1║
║7║艦隊║1║1║
║4║貨物║2║7║
║5║運輸║2║7║
║2║IT║2║6║
║3║食品║2║6║
╚═════════╩═════ ═════════════════════

我嘗試了不同的ORDER BY s但沒有工作。

我的存儲過程:

WITH Hierarchy(ChildId, DeparmentName, Generation, ParentID) 
AS 
(
SELECT DepartmentID, DeparmentName, 0, ParentID 
    FROM Departments AS FirtGeneration 
    WHERE ParentID IS NULL 
UNION ALL 
    SELECT NextGeneration.DepartmentID, NextGeneration.DeparmentName, Parent.Generation + 1, Parent.ChildId 
     FROM Departments AS NextGeneration 
     INNER JOIN Hierarchy AS Parent ON NextGeneration.ParentID = Parent.ChildId  
) 
SELECT * FROM Hierarchy 
OPTION(MAXRECURSION 32767) 

我使用MS SQL Server 2005的

回答

1

嘗試路徑保存到頂部的分層查詢:

WITH Hierarchy(ChildId, DeparmentName, Generation, ParentID, Path) AS (
     SELECT DepartmentID, DepartmentName, 0, ParentID, 
      RIGHT('000' + CAST(DepartmentID as VARCHAR(MAX)), 3) as Path 
     FROM Departments FirstGeneration 
     WHERE ParentID IS NULL 
     UNION ALL 
     SELECT NextGeneration.DepartmentID, NextGeneration.DeparmentName, Parent.Generation + 1, Parent.ChildId, 
      Path + '-->' + CAST(RIGHT('000' + CAST(NextGeneration.DepartmentID as VARCHAR(MAX)), 3) 
     FROM Departments NextGeneration INNER JOIN 
      Hierarchy Parent 
      ON NextGeneration.ParentID = Parent.ChildId  
    ) 
SELECT h.* 
FROM Hierarchy h 
ORDER BY path 
OPTION(MAXRECURSION 32767); 
+0

代碼不跑。有一些SQL語法錯誤。 – milo2011