2010-11-12 5 views
4

J'ai le tableau suivant:TSQL CTE récursive fileté de tri

ID parentID name 

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

Pour aider à tester ...

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' 

Je suis en train de créer un « thread » hiérarchie, mais je veux à la liste des nœuds enfants sous leurs parents comme ceci:

ID parentID name 

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

Si j'utilise un CTE récursive comme celui-ci ...

;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 

Je termine avec cette ...

ID parentID name 

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

des idées? Merci d'avance.

Répondre

3

Vous pouvez construire un chemin d'arbre que vous avancez, et le commander par cette

Quelque chose comme

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 exceptionnelle ! – John

0

Essayez d'ajouter une clause ORDER BY tels que:

SELECT * FROM Features 
ORDER BY parentID