sql >> Databasteknik >  >> RDS >> Sqlserver

Rekursiva barn-/förälderfrågor i T/SQL

Du behöver din rekursion för att också bygga något som kan sorteras efter i slutet:

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 )

(observera att jag har lagt till ett sant rotelement)

;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

returnerar

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

Inklusive hierarchy för 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

Beroende på hur stora dina id:n blir kan du behöva göra saker med vänster stoppning med nollor för att få rätt sortering.

Observera att SQL 2008 har en inbyggd hierarchy typ för sånt här...



  1. MySQL Beräkna procentandel

  2. DATE ADD-funktion i PostgreSQL

  3. Rails mysql2 odefinierad metod `acceptera' för nil:NilClass

  4. Hur man får gårdagens datum i T-SQL