вывод дерева с сортировкой

Tester666
Дата: 06.06.2011 15:59:51
Добрый день всем!
возник такой вопрос - есть таблица с иерархией (inid - идент-р, inidparent - ссылка на родителя из этой же таблицы, inChildNum - номер ребенка среди детей родителя).
Нужно получить отсортированное дерево.
Например, -1-null-Родитель-1
-2-1-Потомок1-1
-4-2-Подпотомок1-1
...и так далее...
-5-2-Подпотомок2-2
-3-1-Потомок2-2
Вложенность дерева неизвестна.
Вот такой вариант получился у меня -
WITH Tasks(inId, inIdParent, stTheme, inChildNum) AS 
(   
    SELECT t.inId, t.inIdParent, t.stTheme, t.inChildNum 
    FROM suTasks t
    WHERE inIdParent is null
    UNION ALL
    SELECT s.inId, s.inIdParent, s.stTheme, s.inChildNum
    FROM suTasks s inner join Tasks b on  s.inidparent=b.inid) 
SELECT inId, inIdParent, stTheme, inChildNum
FROM Tasks

Но он не сортирует дерево как нужно, т.е. возвращет вот что:
-1-null-Родитель-1
-2-1-Потомок1-1
-3-1-Потомок2-2
-4-2-Подпотомок1-1
-5-2-Подпотомок2-2
...и так далее...
Подскажите в каком направлении рыть, кто сталкивался...
Заранее спасибо
Glory
Дата: 06.06.2011 16:04:17
Tester666
Подскажите в каком направлении рыть, кто сталкивался...

Использовать ORDER BY ?
Tester666
Дата: 06.06.2011 18:11:14
Glory, не вижу как ORDER BY может мне помочь.
Гавриленко Сергей Алексеевич
Дата: 06.06.2011 18:12:49
Tester666
Glory, не вижу как ORDER BY может мне помочь.
Вам кроме order by ничего не поможет. Потому что это единственный способ заставить сервер возвращать что-либо в каком-либо порядке.
Владимир СА
Дата: 06.06.2011 19:20:06
Tester666
Добрый день всем!
возник такой вопрос - есть таблица с иерархией (inid - идент-р, inidparent - ссылка на родителя из этой же таблицы, inChildNum - номер ребенка среди детей родителя)....
inChildNum - номер ребенка среди детей родителя - Мне кажется это лишнее...
Таблица для построения дерева.
(id - идент-р, id_par - ссылка на родителя из этой же таблицы, name - наименование узла, ord - поле для сортировки, ... другие поля при необходимости)
Ну и пример
declare @t_tree table (id int not null, id_par int, name varchar(1000) not null, ord int not null)\ninsert into @t_tree (id,id_par,name,ord) Values \n(1, null, \'Узел 1\', 1),\n(2, null, \'Узел 2\', 2),\n(6,   2, \'Узел 21\', 6),\n(7,   6, \'Узел 211\', 7),\n(3,   1, \'Узел 11\', 3),\n(4,   3, \'Узел 111\', 4),\n(5,   1, \'Узел 12\', 5)\n\n\nSELECT * FROM @t_tree\n\n;WITH C ([ID],[ID_PAR],[NAME],[ORD],[Sort]) AS\n(\n\tSELECT B.[ID], B.[ID_PAR],B.[NAME],B.[ORD],\n\t      CONVERT(varchar(max), right(REPLICATE(\'0\',10 - LEN(cast(B.[ORD] as varchar(10)))) + cast(B.[ORD] as varchar(10)), 10))\n\t  FROM @t_tree AS B WHERE B.[ID_PAR] is null\n\tUNION ALL\n\tSELECT D.[ID], D.[ID_PAR],D.[NAME],D.[ORD],\n\tCONVERT (varchar(max), RTRIM(Sort) + \'| \' + right(REPLICATE(\'0\',10 - LEN(cast(D.[ORD] as varchar(10)))) + cast(D.[ORD] as varchar(10)), 10))\n\tFROM @t_tree AS D\n\tINNER JOIN C\n\tON C.[ID] = D.[ID_PAR]\n)\nSELECT [ID],[ID_PAR],[NAME],[ORD] FROM C\nORDER BY [Sort]
Огромное спасибо всем ребятам, которые мне помогли построить дерево в первый раз...
CTE для построения дерева
Tester666
Дата: 07.06.2011 08:13:02
Владимир СА, насчет inChildNum в принципе верно, это вспомогательное поле, и нужно не мне.
Ваш вариант мне подходит, все получилось. Огромное спасибо за помощь!!!
gds
Дата: 08.06.2011 10:39:43
Tester666,

Если сервер не ниже 2008, то иерархию можно вести в типе данных hierarchy. Очень удобная штука если почитать и разобраться.
Все что нужно построить первичный ключ и кластерный индекс по этому полю и вперед. даже order by не нужен.
Tester666
Дата: 08.06.2011 11:41:50
Радость по поводу успеха была преждевременной. Поле inChildNum выкидывать не нужно было, оно используется для сортировки внутри уровня.
Пример,
-1-null-Родитель-1
-2-1-Потомок1-1
-4-2-Подпотомок1-1
...и так далее...
-5-2-Подпотомок2-3
-6-2-Подпотомок3-2
-3-1-Потомок2-2.
А должно получиться
-1-null-Родитель-1
-2-1-Потомок1-1
-4-2-Подпотомок1-1
...и так далее...
-6-2-Подпотомок3-2
-5-2-Подпотомок2-3
-3-1-Потомок2-2.

Поэтому вариант Владимир СА мне не подошел...может его как-то тоже можно допилить?
Tester666
Дата: 08.06.2011 11:42:28
gds,

к сожалению у меня 2005.
Владимир СА
Дата: 08.06.2011 12:25:27
Tester666,

Покажи СВОЙ пример таблицы (пример как здесь)
declare @t_tree table (id int not null, id_par int, name varchar(1000) not null, ord int not null)
insert into @t_tree (id,id_par,name,ord) Values 
(1, null, 'Узел 1', 1),
(2, null, 'Узел 2', 2),
(6,   2, 'Узел 21', 6),
(7,   6, 'Узел 211', 7),
(3,   1, 'Узел 11', 3),
(4,   3, 'Узел 111', 4),
(5,   1, 'Узел 12', 5)
И какой результат нужен.