Можете ли вы помочь мне написать рекурсивный запрос для двух таблиц? - PullRequest
0 голосов
/ 26 марта 2019

Мне нужно написать рекурсивный запрос для поиска всех дочерних узлов в этих таблицах.

Например, мне нужно найти все дочерние ExecutorTasks для ParentManagerTaskId = 6

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

1 Ответ

0 голосов
/ 26 марта 2019

Ваша модель немного вводит в заблуждение, поскольку у вас есть две таблицы, которые связаны друг с другом, и вы хотите отображать записи только из одной.Это означает, что вы должны сделать 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 таблицы.

...