Ну, можно написать обобщенный анализатор и менеджер процессов, который мог бы справиться с этим для вас, но, к счастью, он уже поставляется с Linux. Все, что вам нужно сделать, это сказать ему, какую команду запустить, и она будет обрабатывать перенаправление для вас.
Итак, если бы вы немного изменили свои команды, вы могли бы легко это сделать. Просто объедините слова вместе со строками, заключив в кавычки, когда в этих словах могут быть пробелы или другие специальные символы, и тогда вы можете использовать список, такой как:
/bin/sh
, -c
, {your new string here} > /some/file
[ 115]
Et вуаля, материал, записанный на диск. :)
Решенный проблема с помощью изменения метода Mark's, но я не сохраняю путь узла в каждом узле, таким образом, я могу более легко переместить их вокруг дерева. Вместо этого я изменил свой столбец 'OrderBy' от интервала до 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 уровней / макс. 1 000 детей на родительский узел - если я запустил OrderBy в 0), но более чем достаточно для моих потребностей.
Одним путем Вы могли сделать, это должно добавить столбец иерархии, который имеет все предыдущие идентификаторы в списке:
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 является основанным на операция со строками идентификатором. В противном случае необходимо бросить его к varchar прежде, чем связать его.
Вам не нужен весь этот материал объединения, я думаю, что это должно работать:
select
TaskId,
ParentTaskId,
[Name],
COALESCE(ParentTaskId, TaskId) as groupField
from
task
order by
COALESCE(ParentTaskId, TaskId), ParentTaskId, TaskId
Так как Вы не указываете "ORDER BY", как Вы ожидаете, что он возвращает их в порядке (кроме надежды запроса, анализатор будет работать некоторым ожидаемым способом?).
Если Вы хотите это в ParentTaskId, порядке TaskId, то выберите TaskId как ParentTaskId и ПУСТОЙ УКАЗАТЕЛЬ как TaskId в первом элементе ОБЪЕДИНЕНИЯ; затем
ORDER BY ParentTaskId, TaskId?