sql >> Databáze >  >> RDS >> Sqlserver

Rekurzivní podřízené/nadřazené dotazy v T/SQL

Budete potřebovat svou rekurzi, abyste také vytvořili něco, podle čeho lze na konci třídit:

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 )

(všimněte si, že jsem přidal skutečný kořenový prvek)

;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

vrací

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

Včetně hierarchy pro ilustraci:

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

V závislosti na tom, jak velká jsou vaše ID, možná budete muset udělat věci s levým odsazením nulami, abyste dosáhli správného řazení.

Všimněte si, že SQL 2008 má vestavěnou hierarchy zadejte pro tento druh věcí...



  1. Naplňování polí v modální formě pomocí PHP, jQuery

  2. Práce s objektem BLOB v Oracle

  3. problém s Add_month v oracle, potřebuji vygenerovat fakturační cyklus

  4. Rozdíl dat mezi dvěma záznamy ve stejné tabulce