Упорядочивание иерархии из рекурсивного запроса приводит к SQL 2005

Ну, можно написать обобщенный анализатор и менеджер процессов, который мог бы справиться с этим для вас, но, к счастью, он уже поставляется с Linux. Все, что вам нужно сделать, это сказать ему, какую команду запустить, и она будет обрабатывать перенаправление для вас.

Итак, если бы вы немного изменили свои команды, вы могли бы легко это сделать. Просто объедините слова вместе со строками, заключив в кавычки, когда в этих словах могут быть пробелы или другие специальные символы, и тогда вы можете использовать список, такой как:

/bin/sh, -c, {your new string here} > /some/file [ 115]

Et вуаля, материал, записанный на диск. :)

5
задан Nick 12 February 2009 в 22:11
поделиться

4 ответа

Решенный проблема с помощью изменения метода 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), но более чем достаточно для моих потребностей.

2
ответ дан 14 December 2019 в 13:48
поделиться

Одним путем Вы могли сделать, это должно добавить столбец иерархии, который имеет все предыдущие идентификаторы в списке:

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 прежде, чем связать его.

3
ответ дан 14 December 2019 в 13:48
поделиться

Вам не нужен весь этот материал объединения, я думаю, что это должно работать:

select
 TaskId,
 ParentTaskId,
 [Name],
 COALESCE(ParentTaskId, TaskId) as groupField
from
 task
order by
 COALESCE(ParentTaskId, TaskId), ParentTaskId, TaskId
1
ответ дан 14 December 2019 в 13:48
поделиться

Так как Вы не указываете "ORDER BY", как Вы ожидаете, что он возвращает их в порядке (кроме надежды запроса, анализатор будет работать некоторым ожидаемым способом?).

Если Вы хотите это в ParentTaskId, порядке TaskId, то выберите TaskId как ParentTaskId и ПУСТОЙ УКАЗАТЕЛЬ как TaskId в первом элементе ОБЪЕДИНЕНИЯ; затем

ORDER BY ParentTaskId, TaskId?

0
ответ дан 14 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: