Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 вывод дерева с сортировкой  [new]
Tester666
Member

Откуда:
Сообщений: 179
Добрый день всем!
возник такой вопрос - есть таблица с иерархией (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
...и так далее...
Подскажите в каком направлении рыть, кто сталкивался...
Заранее спасибо
6 июн 11, 15:59    [10770969]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева с сортировкой  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tester666
Подскажите в каком направлении рыть, кто сталкивался...

Использовать ORDER BY ?
6 июн 11, 16:04    [10771011]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева с сортировкой  [new]
Tester666
Member

Откуда:
Сообщений: 179
Glory, не вижу как ORDER BY может мне помочь.
6 июн 11, 18:11    [10772536]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева с сортировкой  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Tester666
Glory, не вижу как ORDER BY может мне помочь.
Вам кроме order by ничего не поможет. Потому что это единственный способ заставить сервер возвращать что-либо в каком-либо порядке.
6 июн 11, 18:12    [10772550]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева с сортировкой  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
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)
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)


SELECT * FROM @t_tree

;WITH C ([ID],[ID_PAR],[NAME],[ORD],[Sort]) AS
(
	SELECT B.[ID], B.[ID_PAR],B.[NAME],B.[ORD],
	      CONVERT(varchar(max), right(REPLICATE('0',10 - LEN(cast(B.[ORD] as varchar(10)))) + cast(B.[ORD] as varchar(10)), 10))
	  FROM @t_tree AS B WHERE B.[ID_PAR] is null
	UNION ALL
	SELECT D.[ID], D.[ID_PAR],D.[NAME],D.[ORD],
	CONVERT (varchar(max), RTRIM(Sort) + '| ' + right(REPLICATE('0',10 - LEN(cast(D.[ORD] as varchar(10)))) + cast(D.[ORD] as varchar(10)), 10))
	FROM @t_tree AS D
	INNER JOIN C
	ON C.[ID] = D.[ID_PAR]
)
SELECT [ID],[ID_PAR],[NAME],[ORD] FROM C
ORDER BY [Sort]
Огромное спасибо всем ребятам, которые мне помогли построить дерево в первый раз...
CTE для построения дерева
6 июн 11, 19:20    [10772947]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева с сортировкой  [new]
Tester666
Member

Откуда:
Сообщений: 179
Владимир СА, насчет inChildNum в принципе верно, это вспомогательное поле, и нужно не мне.
Ваш вариант мне подходит, все получилось. Огромное спасибо за помощь!!!
7 июн 11, 08:13    [10774298]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева с сортировкой  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Tester666,

Если сервер не ниже 2008, то иерархию можно вести в типе данных hierarchy. Очень удобная штука если почитать и разобраться.
Все что нужно построить первичный ключ и кластерный индекс по этому полю и вперед. даже order by не нужен.
8 июн 11, 10:39    [10780851]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева с сортировкой  [new]
Tester666
Member

Откуда:
Сообщений: 179
Радость по поводу успеха была преждевременной. Поле 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.

Поэтому вариант Владимир СА мне не подошел...может его как-то тоже можно допилить?
8 июн 11, 11:41    [10781440]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева с сортировкой  [new]
Tester666
Member

Откуда:
Сообщений: 179
gds,

к сожалению у меня 2005.
8 июн 11, 11:42    [10781450]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева с сортировкой  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
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)
И какой результат нужен.
8 июн 11, 12:25    [10781902]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева с сортировкой  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Tester666
Радость по поводу успеха была преждевременной. Поле 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.

Поэтому вариант Владимир СА мне не подошел...может его как-то тоже можно допилить?

Сортировка у меня идет по полю ORD только согласно иерархии. Сортировка идет как внутри узла, так и внешняя (по всему дереву)...
Чувствуется вы не работали с деревьями...
Пусть будет задача что вам нужно переместить узел со всеми дочерними узлами с одно места в другое с помощью механизма Drag&Drop. В вашем случае сортировка как внутри узла пойдет? Возможен случай что к 1 рядом встанет опять 1... Это что за ерунда будет...
8 июн 11, 12:36    [10781991]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева с сортировкой  [new]
Tester666
Member

Откуда:
Сообщений: 179
Реализацию добавления нового потомка я пока не рассматриваю. Моя задача получить нужное дерево, и я рассматриваю для начала все варианты.
Возможно придется остановиться на моем запросе.
Но решение как сортировать внутри уровня пока мной не найдено.
Неужели это никак не реализовать?
З.Ы. с деревьями в т-скл работаю действительно в первый раз.
8 июн 11, 12:50    [10782116]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить