sql >> Database >  >> RDS >> Sqlserver

Recursieve onderliggende/ouderzoekopdrachten in T/SQL

Je hebt je recursie nodig om ook iets te bouwen dat aan het einde kan worden gesorteerd:

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 )

(merk op dat ik een echt root-element heb toegevoegd)

;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

retourneert

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

Inclusief de hierarchy ter illustratie:

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

Afhankelijk van hoe groot je ID's worden, moet je misschien dingen doen met links-opvulling met nullen om de sortering goed te krijgen.

Merk op dat SQL 2008 een ingebouwde hierarchy heeft typ voor dit soort dingen...



  1. Aangepaste velden in Many2Many JoinTable

  2. Verschil tussen substring in Postgresql

  3. Oracle.DataAccess.Dll laadprobleem op x-64 machine

  4. Moeilijkheden bij het installeren van mysql gem op Ubuntu