T-SQL:从没有父ID的层次结构确定上线和下线

时间:2014-09-24 13:05:10

标签: tsql hierarchy

我有这个自引用表格,我应该在没有提供父ID的情况下获得上线,下线和层次结构级别。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用递归CTE? 例如: 假设您有表tbl(EmpId,Name,MngrId)具有自引用关系

create table tbl
(
EmpId  int not null, 
Name nvarchar(100), 
MngrId int null) 

insert into tbl(EmpId, Name, MngrId)
values  (1,'Adel',Null),
        (2,'Ali',1),
        (3,'Shaban',1),
        (4,'Mark',3),
        (5,'John',3),
        (6,'Tony',Null),
        (7,'Peter',6)

您可以创建一些类似的视图:

create view Employees
Begin

with cte 
as
(
Select EmpId,Name, Null as MngrId, cast(null as nvarchar(100)) as MngrName, 1 as EmpLevel
from tbl
where MngrId is Null
Union All
Select t.EmpId, t.Name, c.EmpId as MngrId, c.Name as MngrName, c.EmpLevel + 1 as EmpLevel
from tbl t
inner join cte c
on t.MngrId =  c.EmpId
)
Select *
from cte
order by EmpLevel, EmpId

End

您现在可以使用EmpLevel在不同级别和MngrName之间跳转以获取有关父节点的信息