【发布时间】:2015-09-07 19:16:31
【问题描述】:
我正在尝试(但失败)正确排序我的递归 CTE。我的表由一个父子结构组成,其中一个任务可以在各种不同的级别上与另一个任务相关。
例如,我可以创建一个任务(这是父任务),然后从中创建一个子任务,然后从该子任务创建一个子任务,依此类推..
以下是我包含的一些测试数据。目前它是由Path 按字母顺序排列的。
所以如果我要创建一个任务。它会给我该任务的 TaskID(比如 50)——然后我可以为该主要任务(51、52、53、54、55)创建 5 个子任务。然后我可以将子任务添加到 5 个子任务 (51->56) (53->57) 但是当我想要订单时我需要它返回
所以我需要它的顺序
- 50
- 51
- 56
- 52
- 53
- 57
- 54
- 55
- 51
测试数据的正确顺序
这是我一直在使用的代码
DECLARE @TaskID NUMERIC(10,0)
SET @TaskID = 38
;WITH cte AS
(
SELECT
t.TaskID
,t.ParentID
,t.Title
,CONVERT(VARCHAR(MAX),'') AS [Nest]
,CONVERT(VARCHAR(MAX),'') AS [Path]
,t.CreatedDate
FROM
tasks.Tasks t
WHERE
t.ParentID IS NULL
AND t.TaskID = @TaskID
UNION ALL
SELECT
sub.TaskID
,sub.ParentID
,sub.Title
,cte.[Nest] + CONVERT(VARCHAR(MAX),sub.TaskID) AS [Nest]
,cte.[Path] + ',' + CONVERT(VARCHAR(MAX),sub.TaskID) AS [Path]
,sub.CreatedDate
FROM
tasks.Tasks sub
INNER JOIN cte ON cte.TaskID = sub.ParentID
)
SELECT
TaskID
,ParentID
,Title
,Nest
,[Path]
,CreatedDate
FROM (
SELECT
cte.TaskID
,cte.ParentID
,cte.Title
,NULLIF(LEN(cte.[Path]) - LEN(REPLACE(cte.[Path], ',', '')),0) Nest
,CONVERT(VARCHAR(25),@TaskID) + cte.[Path] AS [Path]
,cte.CreatedDate
FROM
cte
)a
ORDER BY
a.[Path]
我感觉它会非常明显,但我真的不确定如何进行。我考虑了更多的递归、函数、拆分字符串,但没有成功。
如果我不清楚,请道歉
【问题讨论】:
标签: sql tsql recursion hierarchy