Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Рекурсивни Child/Parent заявки в T/SQL

Ще ви трябва вашата рекурсия, за да изградите и нещо, което може да бъде сортирано в края:

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 )

(забележете, че добавих истински основен елемент)

;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

връща

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

Включително hierarchy за илюстрация:

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

В зависимост от това колко големи стават вашите идентификатори, може да се наложи да правите неща с ляво допълване с нули, за да получите правилното сортиране.

Имайте предвид, че SQL 2008 има вградена hierarchy тип за такива неща...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете ограничение CHECK в SQL Server (примери за T-SQL)

  2. Обработка на NULL стойност в UNPIVOT

  3. Как да направите редактируема заявка за преминаване / преминаване?

  4. Приложете функционалност за пейджинг (пропускане/вземане) с тази заявка

  5. Как да изтриете напълно дублиращи се редове