【问题标题】:CTE to traverse back up a hierarchy?CTE 遍历备份层次结构?
【发布时间】:2009-02-25 06:13:48
【问题描述】:

我可以在分层数据模型中找到给定记录的所有子项(请参见下面的代码),但我不确定如何使用给定的子 ID 遍历父/子链。谁能指出我正确的方向来弄清楚如何做到这一点?这在 Linq to SQL 中也可以吗?

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]

【问题讨论】:

    标签: sql linq-to-sql hierarchy common-table-expression


    【解决方案1】:

    啊,我想通了:

    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
    

    【讨论】:

    • 感谢您发布您的解决方案!它为我节省了几个小时!
    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多