sql >> Database teknologi >  >> RDS >> Sqlserver

Rekursive børn/forældre-forespørgsler i T/SQL

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...



  1. Låser MySql automatisk rækker, eller skal jeg tilføje lås i deletilstand?

  2. MySQL-lagret procedure:OUT-parameteren indstilles ikke

  3. MyBatis enum brug

  4. Spørgsmål om iPhone emoji og websider