T-SQL 递归函数 - 具有 ParentID 的 CTE
T-SQL Recursive Function - CTE with ParentID
我正在尝试在 SQL 服务器中编写一个查询,以提取 linked 到任务的所有信息,但我遇到了一些问题。我想要发生的是当我传入一个参数 (@TaskID) 并将其传递给该 ID 的 return 任务信息以及与该 ID 相关的任何子任务信息时。
问题在于,一旦您到达第一个子任务,它实际上就失去了 link 整个父任务 ID。例如:TaskID (3) 最终 linked 到 TaskID (1) 但因为它是 TaskID (2) 的子任务,所以除非我将 Parent (TaskID 1) 加入到 TaskID 2,否则无法检查然后到 TaskID 3.
我们想要做的是拥有无限数量的子任务,但这需要太多的连接。
请问有没有更好的方法?
Table 明智的结构或查询。
样本Table结构
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”作为 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
感谢大家的帮助
我正在尝试在 SQL 服务器中编写一个查询,以提取 linked 到任务的所有信息,但我遇到了一些问题。我想要发生的是当我传入一个参数 (@TaskID) 并将其传递给该 ID 的 return 任务信息以及与该 ID 相关的任何子任务信息时。
问题在于,一旦您到达第一个子任务,它实际上就失去了 link 整个父任务 ID。例如:TaskID (3) 最终 linked 到 TaskID (1) 但因为它是 TaskID (2) 的子任务,所以除非我将 Parent (TaskID 1) 加入到 TaskID 2,否则无法检查然后到 TaskID 3.
我们想要做的是拥有无限数量的子任务,但这需要太多的连接。
请问有没有更好的方法?
Table 明智的结构或查询。
样本Table结构
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”作为 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
感谢大家的帮助