[英]T-SQL Recursive Function - CTE with ParentID
我正在尝试在SQL Server中编写查询以提取链接到任务的所有信息,但遇到了一些问题。 我想发生的是当我传入参数(@TaskID)并为此返回该ID的任务信息以及与该ID相关的任何子任务信息时。
问题是,一旦您到达第一个子任务,它实际上就会失去与整个父任务ID的链接。 例如:TaskID(3)最终链接到TaskID(1),但是由于它是TaskID(2)的子任务,因此除非我将Parent(TaskID 1)加入TaskID 2,然后再加入TaskID 3,否则无法进行检查。 。
我们想做的是拥有无限数量的子任务,但这将需要太多的联接。
我想知道是否有更好的方法?
表结构或查询明智。
样本表结构
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,因为这将是最高级别。 因此,我想传递1,而不是代码块中的t.TaskID = 3。
这对我有用。 现在将“ 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
谢谢大家的帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.