答案 0 :(得分:2)
您可以使用递归CTE构建完整层次结构的表示,然后使用内置的hierarchyid
类型,该类型知道如何正确排序层次结构:
declare @t table (ID int not null, controlName varchar(17) not null, dependencyFK int null)
insert into @t(ID,controlName,dependencyFK) values
(1 ,'One' ,null),
(2 ,'Two' ,1),
(3 ,'Three' ,2),
(4 ,'Four' ,2),
(5 ,'Five' ,null),
(6 ,'Six' ,1),
(7 ,'Seven' ,5),
(8 ,'Eight' ,null),
(9 ,'Nine' ,5),
(10,'Ten' ,null)
;With BuiltHierarchy as (
select *,'/' + CONVERT(varchar(max),ID) + '/' as Hier
from @t
union all
select bh.ID, bh.controlName, o.dependencyFK,'/' + CONVERT(varchar(max),o.ID) + Hier as Hier
from BuiltHierarchy bh
inner join
@t o on bh.dependencyFK = o.ID
)
select *
from BuiltHierarchy
where dependencyFK is null
order by CONVERT(hierarchyid,Hier)
同时,您可能希望考虑直接在建模层次结构时切换到实际使用此类型,而不是使用现有的"子点在父级"表示,不太适合执行分层数据的一般处理。
结果:
ID controlName dependencyFK Hier
----------- ----------------- ------------ -----
1 One NULL /1/
2 Two NULL /1/2/
3 Three NULL /1/2/3/
4 Four NULL /1/2/4/
6 Six NULL /1/6/
5 Five NULL /5/
7 Seven NULL /5/7/
9 Nine NULL /5/9/
8 Eight NULL /8/
10 Ten NULL /10/