sql-server-2005 - 在SQL 2005中从递归查询结果排序层次结构

标签 sql-server-2005 recursion hierarchy common-table-expression

我有一个带有以下各列的“任务”表(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/

相关文章:

c++ - 找到字符串中的所有回文

c++ - 无法将枚举值传递给递归模板 (C++)

security - Symfony2 的 role_hierarchy

java - 如何获得 Java 源代码的完整调用层次结构?

c# - SQL Server 连接字符串异步处理=true

sql-server-2005 - SSIS - 转换日期以在表达式中使用

sql-server - 找不到用于定位的行?

java - 使用递归根据用户输入确定斐波那契数

PostgreSQL 简单键与复合键

sql - 需要使用t-sql代码创建一个excel文件