0

Я пытаюсь написать запрос в SQL Server, чтобы извлечь всю информацию, связанную с задачей, но я столкнулся с какой-то проблемой. Я хочу, чтобы это произошло, когда я передаю параметр (@TaskID) и для этого возвращаю информацию о задании для этого идентификатора, а также любую информацию о подзадаче, связанную с этим идентификатором.Рекурсивная функция T-SQL - CTE с ParentID

Проблема в том, что как только вы достигнете первой подзадачи, она эффективно теряет свою связь с общим родительским идентификатором. Например: TaskID (3) в конечном итоге связан с TaskID (1), но поскольку это подзадача TaskID (2), нет возможности проверить, если я не присоединяюсь к родительскому (TaskID 1) к TaskID 2, а затем к TaskID 3

Мы хотели бы иметь бесконечное количество подзадач, но для этого потребуется слишком много объединений.

Мне было интересно, был ли лучший способ?

Структура таблицы или запрос мудрый.

Пример структуры таблицы Table Structure

WITH cte AS (
SELECT 
    t.TaskID 
    ,t.Title 
    ,t.ParentID 
    ,CAST(t.TaskID AS NVARCHAR(MAX)) [Path] 
FROM 
    tasks.Tasks t 
WHERE 
    t.TaskID = 3 

UNION ALL 

SELECT 
    c.ParentID 
    ,c.Title 
    ,t.ParentID 
    ,c.[Path] + '->' + CAST(t.TaskID AS NVARCHAR(MAX)) 
FROM 
    tasks.Tasks t 
    INNER JOIN cte c on c.ParentID = t.TaskID 
) 

SELECT 
    cte.TaskID 
    ,cte.Title 
    ,cte.[Path] 
FROM 
    cte 
WHERE 
    cte.ParentID IS NULL 

Это дает правильный результат, но я должен действительно пройти TaskId без ParentID, как это будет верхний уровень. Поэтому вместо t.TaskID = 3 в моем блоке кода я хотел бы передать 1. У меня будет игра ...

+4

Общие табличные выражения являются путь, хотя бесконечное может быть проблема: P Другое наблюдение: TaskType и название является строкой, приведет к большому количеству впустую пространство. Какая версия SQL Server? – UnhandledExcepSean

+2

Возможный дубликат [Sql Hierarchy loop query] (http://stackoverflow.com/questions/18427154/sql-hierarchy-loop-query) – Amit

+1

Это дубликат выше ^^^^^ , но если вы хотите у вас больше 100 циклов, которые нужно добавить ОПЦИЯ (МАКСИРОВАНИЕ 1000) в нижней части CTE –

ответ

1

Это сработало для меня. Передача '1', поскольку TaskID теперь позволит мне увидеть все связанные с ним подзадачи (в примере 2 & 3).

WITH cte AS 
(
SELECT 
    t.TaskID 
    ,t.Title 
    ,t.ParentID 
    ,CONVERT(VARCHAR(MAX),'') AS [Path] 
FROM 
    tasks.Tasks t 
WHERE 
    t.ParentID IS NULL 
    AND t.TaskID = @TaskID 

UNION ALL 

SELECT 
    sub.TaskID 
    ,sub.Title 
    ,sub.ParentID 
    ,cte.[Path] + '->' + CONVERT(VARCHAR(MAX),sub.TaskID) AS [Path] 
FROM 
    tasks.Tasks sub 
    INNER JOIN cte ON cte.TaskID = sub.ParentID 
) 

SELECT 
    cte.TaskID 
    ,cte.Title 
    ,cte.ParentID 
    ,CONVERT(VARCHAR(MAX),@TaskID) + cte.[Path] AS [Path] 
FROM 
    cte 

Спасибо за помощь всем

Смежные вопросы