我有一个“任务”表具有以下列(该TaskOrder是父,而不是整个表的范围内订购儿童):

TaskId
ParentTaskId
TaskName
TaskOrder

我有了这个CTE查询返回的所有行:

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

该查询返回通过自己的等级排序正如你所期望的所有任务。我怎样才能改变其订购的结果纳入它们的层次顺序如下?

- Task 1
-- Task 1 Subtask 1
-- Task 1 Subtask 2
- Task 2
- Task 3

感谢。

编辑:答案应该与等级的无限numbr工作

有帮助吗?

解决方案 2

解决使用 Mark的方法的变型,但我不保留在每一个节点的节点路径,这样我就可以更容易地他们走动的树。代替我改变“排序依据”列从int为varchar(3)左用零填充,所以我可以将它们连接到主“的OrderBy”的所有行返回。

with tasks (TaskId, ParentTaskId, OrderBy, [Name], RowOrder) as
(
    select  parentTasks.TaskId,
            parentTasks.ParentTaskId,
            parentTasks.OrderBy,
            parentTasks.[Name],
            cast(parentTasks.OrderBy as varchar(30)) 'RowOrder'
    from    Task parentTasks
    where   ParentTaskId is null

    union all

    select  childTasks.TaskId,
            childTasks.ParentTaskId,
            childTasks.OrderBy,
            childTasks.[Name],
            cast(tasks.RowOrder + childTasks.OrderBy as varchar(30)) 'RowOrder'
    from    Task childTasks
    join    tasks
    on      childTasks.ParentTaskId = tasks.TaskId
)

select * from tasks order by RowOrder

此返回:

TaskId  ParentTaskId  OrderBy  Name                              RowOrder
---------------------------------------------------------------------------
1       NULL          001      Task One                          001
15      1             001      Task One / Task One               001001
2       NULL          002      Task Two                          002
7       2             001      Task Two / Task One               002001
14      7             001      Task Two / Task One / Task One    002001001
8       2             002      Task Two / Task Two               002002
9       8             001      Task Two / Task Two / Task One    002002001
10      8             002      Task Two / Task Two / Task Two    002002002
11      8             003      Task Two / Task Two / Task Three  002002003
3       NULL          003      Task Three                        003
4       NULL          004      Task Four                         004
13      4             001      Task Four / Task One              004001
5       NULL          005      Task Five                         005
6       NULL          006      Task Six                          006    
17      NULL          007      Task Seven                        007
18      NULL          008      Task Eight                        008
19      NULL          009      Task Nine                         009
21      19            001      Task Nine / Task One              009001
20      NULL          010      Task Ten                          010

它不会允许无限层次(最大10级每父节点/最大1000名儿童 - 如果我在0开始排序依据),但足以满足我的需求更多

其他提示

你可以做到这一点的方法之一是添加了所有以前的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。

您并不需要所有的工会的东西,我觉得这应该工作:

select
 TaskId,
 ParentTaskId,
 [Name],
 COALESCE(ParentTaskId, TaskId) as groupField
from
 task
order by
 COALESCE(ParentTaskId, TaskId), ParentTaskId, TaskId

既然你不指定“ORDER BY”,你怎么能指望它返回他们在任何特定的顺序(除了希望查询分析器会在一些预期方式工作?等)。

如果您希望它在ParentTaskId,的TaskID的命令,那么在第一UNION元件选择的taskid作为ParentTaskId和NULL作为的TaskID;然后

ORDER BY ParentTaskId,的TaskID?

scroll top