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

Откуда: Санкт-Петербург
Сообщений: 38
Есть таблица

Tree
id, title, parent -> Tree.id

Хочется сделать вьюху, в которой все это выглядело бы примерно так:

root // id = 0
Child1
Chil2
Chil3
Child4
Chil5
Chil6

то есть с форматированием, чтобы можно было потом использовать в DropDownList`ах

Добавлять левые поля в таблицу не хочется, скорость не очень важна (дерево маленькое). CTE сервер поддерживает, поэтому можно рекурсивно. Походу я так понимаю, надо обойти дерево в глубину, но что-то не очень представляю как это сделать на SQL - ладно бы еще по уровням, а тут...

Вобщем, уважаемые Знатоки, что в черном ящике, какой запрос?
Спасибо.
21 ноя 09, 14:28    [7959776]     Ответить | Цитировать Сообщить модератору
 Re: SQL: форматированный вывод дерева  [new]
O.M.
Member

Откуда: Санкт-Петербург
Сообщений: 38
Форматирование слетело, вот так, конечно же:
root
__Child1
____Child2
____Child2
__Child3
____Child4
____Child5
21 ноя 09, 14:30    [7959778]     Ответить | Цитировать Сообщить модератору
 Re: SQL: форматированный вывод дерева  [new]
miksoft
Member

Откуда:
Сообщений: 38546
O.M.
CTE сервер поддерживает, поэтому можно рекурсивно. Походу я так понимаю, надо обойти дерево в глубину, но что-то не очень представляю как это сделать на SQL - ладно бы еще по уровням, а тут...
Читайте документацию по вашей секретной СУБД, раздел про CTE.
21 ноя 09, 19:53    [7960114]     Ответить | Цитировать Сообщить модератору
 Re: SQL: форматированный вывод дерева  [new]
O.M.
Member

Откуда: Санкт-Петербург
Сообщений: 38
miksoft,

CTE-то не проблема (кстати, мучаю FB, но какая разница - в каком-нибудь MS SQL все то же самое), интересен сам алгоритм.

По идее можно было бы проходить по уровням, форматируя title, прицеплять к каждой выборке строку, а на каждом следующем уровне дописывать к этой строке родительского элемента что-то вроде номера узла в выборке его потомков, а потом сортировать по этим строкам

получилось бы что-то вроде

root (label = '0')
__child1 (label = '01')
__child2 (label = '02')

и т.д.

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

Айдишник что ли взять? И 20 символов на уровень дописывать?)
21 ноя 09, 22:20    [7960286]     Ответить | Цитировать Сообщить модератору
 Re: SQL: форматированный вывод дерева  [new]
miksoft
Member

Откуда:
Сообщений: 38546
O.M.
miksoft,

CTE-то не проблема (кстати, мучаю FB, но какая разница - в каком-нибудь MS SQL все то же самое), интересен сам алгоритм.
В Оракле желаемое сделать не проблема, там есть псевдополе level. Есть ли такое в FB и MS SQL - не знаю.
22 ноя 09, 12:35    [7960846]     Ответить | Цитировать Сообщить модератору
 Re: SQL: форматированный вывод дерева  [new]
O.M.
Member

Откуда: Санкт-Петербург
Сообщений: 38
Да вроде нету.
Ладно, в любом случае уже сделал кое-как по айдишникам, выглядит немного страшно, но работает. На небольших деревьях вроде бы даже не так медленно, по крайней мере на глаз не видно, чтобы запрос тормозил.
Вот, если кому понадобится:

CREATE VIEW ITEMGROUPFORMATTED(
    "id",
    "title")
AS
with recursive "ParentNode" ("id", "title", "parent", "tab", "label")
as
    (select "id", "title", "parent", '    ' as "tab", '0' as "label" from "ItemGroup"
       where "id" = 0
     union all
     select "IG"."id", ("ParentNode"."tab" || "IG"."title") as "title", "IG"."parent",
            ('    ' || "ParentNode"."tab") as "tab",
            ("ParentNode"."label" || lpad(cast("IG"."id" as varchar(20)), 20, '0')) as "label"
     from "ItemGroup" as "IG"
        inner join "ParentNode" on "IG"."parent" = "ParentNode"."id"
     where "IG"."id" <> 0)
select "id", "title" from "ParentNode"
order by "label", "title"
;
22 ноя 09, 14:41    [7960990]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить