Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Rekursive untergeordnete/übergeordnete Abfragen in T/SQL

Sie brauchen Ihre Rekursion, um auch etwas zu bauen, nach dem am Ende sortiert werden kann:

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 )

(Beachten Sie, dass ich ein echtes Root-Element hinzugefügt habe)

;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

zurück

CHILD       GENERATION
----------- -----------
0           0
2           1
1           2
3           3
4           2
5           1

Einschließlich der hierarchy zur Veranschaulichung:

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

Je nachdem, wie groß Ihre IDs werden, müssen Sie möglicherweise links mit Nullen auffüllen, um die Sortierung richtig zu machen.

Beachten Sie, dass SQL 2008 eine eingebaute hierarchy hat Typ für so etwas...