2011-03-28 132 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需要一个稍微不同的方法

注意:虽然你写了“没有递归如此没有机会堆栈溢出“,你仍然需要从无限循环来处理自己,我个人使用递归并为它建立最大”深度“;当递归试图”超越“极限时,我停止它并且返回一个错误