TSQL рекурсивная CTE потоковая сортировка - PullRequest
4 голосов
/ 12 ноября 2010

У меня есть следующая таблица:

ID parentID   name

1  0          car1
2  1          tire
3  2          rubber
4  0          car2
5  2          nut
6  3          black

Чтобы помочь с тестированием ...

CREATE TABLE #TT (ID int
                 ,ParentID int
                 ,Name varchar(25)
                 )

INSERT #TT 
SELECT 1,0,'car1' UNION ALL
SELECT 2,1,'tire' UNION ALL
SELECT 3,2,'rubber' UNION ALL
SELECT 4,0,'car2' UNION ALL
SELECT 5,2,'nut' UNION ALL
SELECT 6,3,'black'

Я пытаюсь создать «многопоточную» иерархию, но я хочуперечислите дочерние узлы под их родителями так:

ID parentID   name

1  0          car1
2  1          tire
3  2          rubber
6  3          black
5  2          nut
4  0          car2

Если я использую рекурсивный CTE, подобный этому ...

;WITH Features
AS
(
    SELECT *
    FROM #TT
    WHERE ParentID = 0

    UNION ALL

    SELECT F.*
    FROM #TT AS F
        INNER JOIN Features
            ON F.ParentID = Features.ID
)

SELECT *
FROM Features

Я получу это ...

ID parentID   name

1  0          car1
4  0          car2
2  1          tire
3  2          rubber
5  2          nut
6  3          black

есть идеи?Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 12 ноября 2010

Вы можете построить древовидный путь и упорядочить его по этому

Что-то вроде

DECLARE @TT TABLE(ID int, ParentID int, Name varchar(25)) 

INSERT @TT  
SELECT 1,0,'car1' UNION ALL 
SELECT 2,1,'tire' UNION ALL 
SELECT 3,2,'rubber' UNION ALL 
SELECT 4,0,'car2' UNION ALL 
SELECT 5,2,'nut' UNION ALL 
SELECT 6,3,'black' 


SELECT  *
FROM    @TT


;WITH Features AS (
        SELECT  *,
                CAST(ID AS VARCHAR(MAX))  + '/' AS TreePath
        FROM    @TT
        WHERE   ParentID = 0
        UNION ALL
        SELECT  tt.*,
                f.TreePath + CAST(tt.ID AS VARCHAR(10)) + '/'
        FROM    @TT tt INNER JOIN
                Features f  ON  tt.ParentID = f.ID
)
SELECT  *
FROM    Features
ORDER BY TreePath
0 голосов
/ 12 ноября 2010

Попробуйте добавить предложение ORDER BY, например:

SELECT * FROM Features 
ORDER BY parentID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...