2009-02-25 7 views
13

Je peux trouver tous les enfants d'un enregistrement donné dans un modèle de données hiérarchique (voir le code ci-dessous) mais je ne suis pas sûr de savoir comment parcourir la chaîne Parent/Enfant avec un ID enfant donné. Quelqu'un peut-il me diriger dans la bonne direction pour comprendre comment faire cela? Est-ce possible aussi dans Linq to SQL?CTE pour parcourir une hiérarchie?

WITH TaskHierarchy (TaskID, [Subject], ParentID, HierarchyLevel, HierarchyPath) AS 
(
    -- Base case 
    SELECT 
     TaskID, 
     [Subject], 
     ParentID, 
     1 as HierarchyLevel, 
     CONVERT(VARCHAR(MAX),'/') AS HierarchyPath 
    FROM Task 
    WHERE TaskID = 2 

    UNION ALL 

    -- Recursive step 
    SELECT 
     t.TaskID, 
     t.Subject, 
     t.ParentID, 
     th.HierarchyLevel + 1 AS HierarchyLevel, 
     CONVERT(varchar(MAX),th.HierarchyPath + CONVERT(VARCHAR(32),t.ParentID) + '/') AS HierarchyPath 
    FROM Task t 
     INNER JOIN TaskHierarchy th ON 
     t.ParentID = th.TaskID 
) 

SELECT * 
FROM TaskHierarchy 
ORDER BY HierarchyLevel, [Subject] 

Répondre

22

Ah, j'ai tout compris:

WITH Hierarchy(TaskID, [Subject], ParentID, IsProject, HLevel) 
AS 
(
    SELECT 
     TaskID, 
     [Subject], 
     ParentID , 
     IsProject, 
     0 as HLevel 
    FROM 
     Task 
    WHERE 
     TaskID = 59 

    UNION ALL 

    SELECT 
     SubDepartment.TaskID, 
     SubDepartment.[Subject], 
     SubDepartment.ParentID , 
     SubDepartment.IsProject, 
     HLevel + 1 
    FROM 
     Task SubDepartment 
    INNER JOIN 
     Hierarchy ParentDepartment 
    ON 
     SubDepartment.TaskID = ParentDepartment.ParentID 
) 

SELECT 
    TaskID, 
    [Subject], 
    ParentID, 
    IsProject, 
    HLevel 
FROM 
    Hierarchy 
ORDER BY 
    HLevel DESC 
+2

Merci pour poster votre solution! Cela m'a sauvé des heures! –

Questions connexes