2009-02-25 20 views
13

Puedo encontrar todos los elementos secundarios de un registro determinado en un modelo de datos jerárquico (vea el código a continuación), pero no estoy seguro de cómo hacer una copia de seguridad de la cadena principal/secundaria con una identificación infantil dada. ¿Alguien puede señalarme en la dirección correcta para descubrir cómo hacer esto? ¿Es esto posible en Linq para SQL también?CTE para realizar una copia de seguridad de una jerarquía?

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] 

Respuesta

22

Ah, lo he descubierto:

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

Gracias por publicar su solución! Me ha ahorrado horas! –

Cuestiones relacionadas