順序付けの階層からの再帰的なクエリの結果SQL2005年
-
22-08-2019 - |
質問
んな作業テーブルの列のTaskOrderでのご購入に関しては子供の範囲内での親ではなく、全体テーブル):
TaskId ParentTaskId TaskName TaskOrder
もうこの熱膨張のクエリが戻すべての列:
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
問題を修正使用の変化 マークの方法, ありません(保持ノードのパスにすべてのノードだったので、より簡単に移動します。代わりに変更しましたが私の"OrderBy'カラムから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の子どもと一緒に親ノード-いのOrderBy0)があります。
他のヒント
そのひとつの方法がいるので、これまで階層カラムは、以前のすべての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前列です。
必要なすべてのeuのものだと思いこの作品:
select
TaskId,
ParentTaskId,
[Name],
COALESCE(ParentTaskId, TaskId) as groupField
from
task
order by
COALESCE(ParentTaskId, TaskId), ParentTaskId, TaskId
かを指定しない"め"と、どのくらいだと予想していますを返しますし、特定の順序でその他を望みながらクエリ分析装置であれストッキングがあります。).
だいたいでParentTaskId,TaskId順に選択しTaskIdとしてParentTaskIdととしてNULLをTaskIdの組合素その
注ParentTaskId,TaskId?
所属していません StackOverflow