SQL Server cte.
, , , udf, , .
, .
1, 11, 2, 13, 21, 3
,
1, 2, 3, 11, 13, 21
.
, ,
1, 11, 13, 2, 21, 3
.
, - !
-, ( ):
DECLARE @T AS TABLE
(
Id int,
[Name] char(3),
parentId int
)
INSERT INTO @T (Id, [Name], parentId) VALUES
(1, 'STU', 0),
(2, 'XYZ', 5),
(3, 'PQR', 5),
(4, 'EFG', 0),
(5, 'ABC', 0),
(6, 'HIJ', 1),
(7, 'DEF', 1),
(8, 'AAA', 3),
(9, 'ZZZ', 3)
. , .
Cte:
;WITH CTE AS
(
SELECT Id,
[Name],
ParentId,
CAST(ROW_NUMBER() OVER(ORDER BY [Name]) as varchar(19)) As Sort
FROM @T
WHERE parentId = 0
UNION ALL
SELECT T.Id,
T.[Name],
T.ParentId,
CAST(Sort + CAST(ROW_NUMBER() OVER(ORDER BY T.[Name]) as varchar(19)) as varchar(19))
FROM @T T
JOIN CTE ON T.parentId = CTE.Id
)
:
SELECT Id, [Name], ParentId
FROM CTE
ORDER BY Sort
:
Id Name ParentId
5 ABC 0
3 PQR 5
8 AAA 3
9 ZZZ 3
2 XYZ 5
4 EFG 0
1 STU 0
7 DEF 1
6 HIJ 1