2011-03-28 131 views
1

我有2列的表格:ID, ParentIDT-SQL:得到一個單列的父母,子女,孫子女... N孩子

我想打一個新表/查看每一行包括所有孩子們在各級一定父母......

例如:

ParentID Level_1 Level_2 Level_3 ... Level_n 

這意味着的parentID是LEVEL_1的父母也就是2級的母公司是level_3的家長等...

我需要沒有遞歸所以沒有機會堆棧溢出做...

在T-SQL

,有一個名爲@@rowcount函數返回我在最後得到了行選擇,所以也許我可以用它裏面while loop or something ...

問題是我該如何知道在開始時要構建多少列? 任何想法如何獲得這個挑戰?

+0

這是一次性工作,還是需要重複執行? – 2011-03-28 12:59:28

+1

不能使用遞歸REALLY co mplicates this ... – JNK 2011-03-28 13:17:18

+0

看向前看到這樣做沒有遞歸,沒有PIVOT。我相信需要遞歸來描述關係圖,我也相信PIVOT已經出來了,因爲您需要知道構建PIVOT查詢需要多少級別,正如@pcofre答案。 – 2011-03-28 13:32:49

回答

0

它可以通過創建一個表值函數TVF,返回僱員的整棵樹以他的水平如下解決:

CREATE FUNCTION [dbo].[GetTree](@EmployeeID int) 
RETURNS @Result Table 
( EmployeeID int, 
    IdParent int, 
    Lvl int 
) 
AS 
BEGIN 
    declare @lvl int 
    set @lvl=0 
    while(@EmployeeID is not null) 
    begin 
     insert into @Result 
     select EmployeeID,ManagerID,@lvl 
     from dbo.MyEmployees 
     where [email protected] 

     select @EmployeeID=ManagerID, 
       @[email protected]+1 
     from dbo.MyEmployees 
     where [email protected] 
    end 

    update @Result 
    set Lvl = (select MAX(Lvl) from @Result)-Lvl+1 
RETURN 
END 

然後簡單地套用旋轉功能,讓你的輸出:

SELECT [1] AS Lvl1, [2] AS Lvl2, [3] AS Lvl3, [4] AS Lvl4 
FROM 
(select a.EmployeeID,b.EmployeeID EID,b.Lvl 
from dbo.MyEmployees a cross apply 
     dbo.GetTree(a.EmployeeID) b) p 
PIVOT 
(MIN (EID) 
FOR Lvl IN 
([1], [2], [3], [4]) 
) AS pvt 
1

你想要得到的是一個數據透視表,但在我看來,這個任務不屬於數據庫。我寧願使用行獲取結果集並將它們「外部」轉換。

爲了實現我所描述的,在SQL Server 2005 +,你可以使用一個公共表表達式(here you can find an example,在SQL Server 2000需要一個稍微不同的方法

注意:雖然你寫了「沒有遞歸如此沒有機會堆棧溢出「,你仍然需要從無限循環來處理自己,我個人使用遞歸併爲它建立最大」深度「;當遞歸試圖」超越「極限時,我停止它並且返回一個錯誤