首页 > 解决方案 > 你能帮我写两个表的递归查询吗?

问题描述

我需要编写递归查询来查找此表中的所有子节点。

例如,我需要找到 ParentManagerTaskId = 6 的所有子 ExecutorTasks

ManagerTasks
{
  Id,
  ParentExecutorTaskId
}

ExecutorTasks
{
  Id,
  ParentManagerTaskId
}



;WITH query AS 
 (
  SELECT et.Id,et.ParentManagerTaskId,mt.ParentExecutorTaskId
  FROM [Planning.ExecutorTasks] et
  left outer join [Planning.ManagerTasks] mt on et.ParentManagerTaskId=mt.Id
  WHERE mt.Id = 6
  UNION ALL      
  SELECT q.Id, q.ParentManagerTaskId,et.Id
  FROM [Planning.ExecutorTasks] et 
   JOIN query q ON et.Id = q.Id   
  )
  SELECT  *
  FROM query

标签: sqlsql-serverhierarchical-datarecursive-query

解决方案


您的模型有点误导,因为您有 2 个相互关联的表,并且您只想显示其中的记录。这意味着您必须在递归部分执行 2 次连接才能获得相关实体的子实体。

尝试以下方法:

;WITH Recursion AS
(
    -- Anchor
    SELECT
        ExecutorTaskId = E.Id,
        RecursionLevel = 0
    FROM
        [Planning.ExecutorTasks] AS E
    WHERE
        E.ParentManagerTaskId = 6

    UNION ALL

    -- Further childs
    SELECT
        ExecutorTaskId = E.Id,
        RecursionLevel = R.RecursionLevel + 1
    FROM
        Recursion AS R
        INNER JOIN [Planning.ManagerTasks] AS M ON R.ExecutorTaskId = M.ParentExecutorTaskId
        INNER JOIN [Planning.ExecutorTasks] AS E ON M.Id = E.ParentManagerTaskId
)
SELECT
    R.RecursionLevel,
    R.ExecutorTaskId
FROM
    Recursion AS R
ORDER BY
    R.RecursionLevel,
    R.ExecutorTaskId

如果您不提供示例值、预期结果和表格的 DDL,我无法测试。


推荐阅读