Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Rekurencyjne zapytania potomne/nadrzędne w T/SQL

Będziesz potrzebować swojej rekurencji, aby zbudować coś, co można posortować na końcu:

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 )

(zauważ, że dodałem prawdziwy element główny)

;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

powraca

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

W tym hierarchy dla ilustracji:

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

W zależności od tego, jak duże są twoje identyfikatory, być może będziesz musiał zrobić rzeczy z lewym dopełnieniem zerami, aby uzyskać prawidłowe sortowanie.

Zauważ, że SQL 2008 ma wbudowaną hierarchy wpisz dla tego rodzaju rzeczy...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używasz Web.Config do konfigurowania parametrów połączenia z bazą danych SQL?

  2. Jaki jest cel używania CommandType.Tabledirect?

  3. Miejsce docelowe serwera SQL a miejsce docelowe OLE DB

  4. Dzielenie daty na 2 kolumny (data + godzina) w SQL

  5. Jak zamienić wiele znaków w SQL?