Du skal bruge din rekursion for også at bygge noget, der kan sorteres efter i slutningen:
declare @t TABLE (
[CHILD] [int] NOT NULL,
[PARENT] [int] NOT NULL
)
insert @t values
( 0, -1), -- I added this
( 1, 2 ),
( 2, 0 ),
( 3, 1 ),
( 4, 2 ),
( 5, 0 )
(bemærk, at jeg har tilføjet et ægte rodelement)
;with n(CHILD, PARENT, GENERATION, hierarchy) as (
select CHILD, PARENT,0, CAST(CHILD as nvarchar) as GENERATION from @t
where PARENT=-1
union all
select nplus1.CHILD, nplus1.PARENT, GENERATION+1,
cast(n.hierarchy + '.' + CAST(nplus1.child as nvarchar) as nvarchar)
from
@t as nplus1 inner join n on nplus1.PARENT=n.CHILD
)
select CHILD,GENERATION
from n
order by hierarchy
returnerer
CHILD GENERATION
----------- -----------
0 0
2 1
1 2
3 3
4 2
5 1
Herunder hierarchy
til illustration:
CHILD GENERATION hierarchy
----------- ----------- ------------------------------
0 0 0
2 1 0.2
1 2 0.2.1
3 3 0.2.1.3
4 2 0.2.4
5 1 0.5
Afhængigt af hvor store dine id'er bliver, skal du muligvis gøre ting med venstre polstring med nuller for at få den rigtige sortering.
Bemærk, at SQL 2008 har et indbygget hierarchy
type for denne slags ting...