У меня есть рекурсивный запрос SQL, который хорошо работает для того, что я хочу, но я не уверен, как его отфильтровать, чтобы ветви фильтровали по алфавиту. Например:
UniqueID | Description | ParentID | MaterializedPath
1 CCC 0 0x00000001
2 BBB 0 0x00000002
3 AAA 0 0x00000003
4 CCCC 1 0x0000000100000004
5 BBBB 1 0x0000000100000005
6 AAAA 2 0x0000000200000006
7 DDDD 2 0x0000000200000007
8 EEEEE 4 0x000000010000000400000008
9 AAAAA 4 0x000000010000000400000009
10 CCCCC 6 0x00000002000000060000000A
11 BBBBB 6 0x00000002000000060000000B
12 FFFFFF 8 0x0000000100000004000000080000000C
13 BBBBBB 8 0x0000000100000004000000080000000D
14 GGGGGG 10 0x00000002000000060000000A0000000E
15 DDDDDD 10 0x00000002000000060000000A0000000F
Возвращает:
UniqueID | Description | ParentID | MaterializedPath
1 CCC 0 0x00000001
4 CCCC 1 0x0000000100000004
8 EEEEE 4 0x000000010000000400000008
12 FFFFFF 8 0x0000000100000004000000080000000C
13 BBBBBB 8 0x0000000100000004000000080000000D
9 AAAAA 4 0x000000010000000400000009
5 BBBB 1 0x0000000100000005
2 BBB 0 0x00000002
6 AAAA 2 0x0000000200000006
10 CCCCC 6 0x00000002000000060000000A
14 GGGGGG 10 0x00000002000000060000000A0000000E
15 DDDDDD 10 0x00000002000000060000000A0000000F
11 BBBBB 6 0x00000002000000060000000B
7 DDDD 2 0x0000000200000007
3 AAA 0 0x00000003
Но на самом деле мне бы хотелось отсортировать каждую ветвь по описанию так, чтобы она возвращалась следующим образом. Таким образом, каждый уровень сортируется по описанию в каждой ветви, так что упорядочиваются те, у кого нет parentID, а затем дочерние элементы этой ветви располагаются под ним и так далее. например, A | -A | -A | -B | - C | -B | - C B C
Так что мои данные выше вернутся так:
UniqueID | Description | ParentID | MaterializedPath
3 AAA 0 0x00000003
2 BBB 0 0x00000002
6 AAAA 2 0x0000000200000006
11 BBBBB 6 0x00000002000000060000000B
10 CCCCC 6 0x00000002000000060000000A
15 DDDDDD 10 0x00000002000000060000000A0000000F
14 GGGGGG 10 0x00000002000000060000000A0000000E
7 DDDD 2 0x0000000200000007
1 CCC 0 0x00000001
5 BBBB 1 0x0000000100000005
4 CCCC 1 0x0000000100000004
9 AAAAA 4 0x000000010000000400000009
8 EEEEE 4 0x000000010000000400000008
13 BBBBBB 8 0x0000000100000004000000080000000D
12 FFFFFF 8 0x0000000100000004000000080000000C
И это мой SQL Запрос:
WITH T AS
(
SELECT
N.UniqueID, N.DESCRIPTION, N.ParentID, CAST(N.UniqueID AS varbinary(512)) AS MaterializedPath
FROM
TEMPTABLE1 N
WHERE
N.ParentID = 0
UNION ALL
SELECT
N.UniqueID, N.DESCRIPTION, N.ParentID, CAST( T.MaterializedPath + CAST(N.UniqueID AS binary(4)) AS varbinary(512) ) AS MaterializedPath
FROM
TEMPTABLE1 N INNER JOIN T
ON N.ParentID = T.UniqueID
)
SELECT *
FROM T
ORDER BY T.MaterializedPath
Пример настройки таблицы:
CREATE TABLE TEMPTABLE1 (
[UniqueID] [int] IDENTITY(1,1) NOT NULL,
Description NVARCHAR(10) NULL,
ParentID Int NULL
)
GO
INSERT INTO TEMPTABLE1 VALUES ('CCC', 0)
INSERT INTO TEMPTABLE1 VALUES ('BBB', 0)
INSERT INTO TEMPTABLE1 VALUES ('AAA', 0)
INSERT INTO TEMPTABLE1 VALUES ('CCCC', 1)
INSERT INTO TEMPTABLE1 VALUES ('BBBB', 1)
INSERT INTO TEMPTABLE1 VALUES ('AAAA', 2)
INSERT INTO TEMPTABLE1 VALUES ('DDDD', 2)
INSERT INTO TEMPTABLE1 VALUES ('EEEEE', 4)
INSERT INTO TEMPTABLE1 VALUES ('AAAAA', 4)
INSERT INTO TEMPTABLE1 VALUES ('CCCCC', 6)
INSERT INTO TEMPTABLE1 VALUES ('BBBBB', 6)
INSERT INTO TEMPTABLE1 VALUES ('FFFFFF', 8)
INSERT INTO TEMPTABLE1 VALUES ('BBBBBB', 8)
INSERT INTO TEMPTABLE1 VALUES ('GGGGGG', 10)
INSERT INTO TEMPTABLE1 VALUES ('DDDDDD', 10)