CTE 遍历备份层次结构? [英] CTE to traverse back up a hierarchy?

查看:25
本文介绍了CTE 遍历备份层次结构?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I can find all the children of a given record in a hierarchical data model (see code below) but I'm not sure how to traverse back up the Parent/Child chain with a given Child ID. Can anyone point me in the right direction to figure out how to do this? Is this possible in Linq to SQL as well?

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]

推荐答案

啊,我想通了:

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

这篇关于CTE 遍历备份层次结构?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆