T-SQL递归函数 - 带有ParentID的CTE

时间:2015-05-29 12:34:43

标签: sql tsql recursion database-design common-table-expression

我正在尝试在SQL Server中编写一个查询来提取链接到任务的所有信息,但我遇到了一些问题。我想要发生的是当我传入一个参数(@TaskID)并为此返回该ID的任务信息以及与该ID相关的任何子任务信息。

问题是,一旦你到达第一个子任务,它就会失去与整个父任务ID的链接。例如:TaskID(3)最终链接到TaskID(1),但因为它是TaskID(2)的子任务,除非我将Parent(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

这给出了正确的结果但是我应该在没有ParentID的情况下传递TaskID,因为这将是顶级。所以在我的代码块中没有t.TaskID = 3,我想要通过1.我会有一个游戏......

1 个答案:

答案 0 :(得分: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

感谢大家的帮助