我有一个带有以下各列的“任务”表(TaskOrder用于在父级而不是整个表的范围内对子级进行排序):
TaskId ParentTaskId TaskName TaskOrder
I've got this CTE query to return all the rows:
with tasks (TaskId, ParentTaskId, [Name]) as
(
select parentTasks.TaskId,
parentTasks.ParentTaskId,
parentTasks.[Name]
from Task parentTasks
where ParentTaskId is null
union all
select childTasks.TaskId,
childTasks.ParentTaskId,
childTasks.[Name]
from Task childTasks
join tasks
on childTasks.ParentTaskId = tasks.TaskId
)
select * from tasks
该查询返回您期望的所有按任务级别排序的任务。我如何更改它以将结果按其层次结构顺序排序,如下所示?
- 任务1
-任务1子任务1
-任务1子任务2
-任务2
-任务3
谢谢。
编辑:答案应该使用无数级。
最佳答案
一种执行此操作的方法是添加一个层次结构列,该列在列表中具有所有先前的ID:
with tasks (TaskId, ParentTaskId, [Name], TaskIdList) as
(
select parentTasks.TaskId,
parentTasks.ParentTaskId,
parentTasks.[Name],
parentTasks.TaskId
from Task parentTasks
where ParentTaskId is null
union all
select childTasks.TaskId,
childTasks.ParentTaskId,
childTasks.[Name],
tasks.TaskIdList + '.' + childTasks.TaskId
from Task childTasks
join tasks
on childTasks.ParentTaskId = tasks.TaskId
)
select TaskId, ParentTaskId, [Name] from tasks
order by TaskIdList
请注意,这假定TaskId是基于字符串的ID。如果不是,则应在连接之前将其强制转换为varchar。
关于sql-server-2005 - 在SQL 2005中从递归查询结果排序层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/539155/