订购从递归查询结果层级SQL 2005中
-
22-08-2019 - |
题
我有一个“任务”表具有以下列(该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
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?
不隶属于 StackOverflow