Нужна ли рекурсия? Похоже, это дает правильный результат:
declare @t table
(DBID int
,Title varchar(10)
,ParentID int
,OrderNum int
)
insert @t
select 1,'aaa',0,1
union select 2,'bbb',0,2
union select 3,'ccc',1,1
union select 4,'ddd',1,2
union select 5,'eee',2,1
select *
from @t
order by ISNULL(NULLIF(ParentID,0),DBID)
,ParentID
,OrderNum
,DBID
EDIT
Объяснение:
Поскольку входные строки соответствуют 1: 1 выходным строкам, и изменяется только порядок строк, это должно быть проблемой упорядочения. Решение состоит в том, чтобы идентифицировать родительско-дочернюю группу, к которой принадлежит каждая строка, и отсортировать сначала по ней, а затем по всем другим значениям.
Единственная сложная часть этого состоит в том, что родительские строки (с ParentID
= 0) неявно получают членство в своей группе из DBID
, тогда как все остальные строки получают его из ParentID
.
Первое WHERE
условие (ISNULL(NULLIF(ParentID,0),DBID)
) обрабатывает это. Это также может быть записано как
CASE WHEN ParentID = 0
THEN DBID
ELSE ParentID
END
Я использовал NULLIF...ISNULL
, поскольку он более лаконичен, но если бы условия сортировки были более сложными, я бы использовал CASE...WHEN
.