2010-11-12 3 views
4

я следующая таблица:TSQL рекурсивного CTE резьбовых сортировки

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 

какие-либо идеи? Заранее спасибо.

ответ

3

Вы можете построить путь дерева, как вы идете вперед, и порядок его этим

Что-то вроде

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

выдающийся astander ! – John

0

Try добавления ORDER BY статьи, такие как:

SELECT * FROM Features 
ORDER BY parentID 
Смежные вопросы