Выборка древовидных данных

Модераторы: kdv, CyberMax

Ответить
ARM
Сообщения: 26
Зарегистрирован: 02 дек 2006, 13:27

Выборка древовидных данных

Сообщение ARM » 13 дек 2006, 16:49

Привет.

Есть проблема, которую сам решить пока не могу. Может кто что подскажет.
ДАНО: таблица (Id, ParentId), т.е. элементарное дерево.
ВОПРОС: Нужно выбрать СРАЗУ (в один набор данных) все данные, выстроенные по псевдо-уровням дерева. Почему псевдо, потому что как такового поля Level в табл. нет. Что значит "выстроенные по псевдо-уровням" - т.е. есть данные в таблице, которые выстраиваются в такое дерево:

- Root
| Level1
| | Item1
| Level2
| | Item2

Нужно, чтобы в результате выборки у меня данные выстроились в след. порядке: Root, Level1, Level2, Item1, Item2.

Вот собственно и все!

ЗЫ: 1) В MSSQL это можно решить с пом. временных таблиц, но в ФБ их нет (пока, но ждать не могу).
2) Id могут идти не по-порядку
3) данные нужны в одном наборе данных, а не поэтапно! Хотя "поэтапно" это все равно приходит к исп. временных таблиц.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Выборка древовидных данных

Сообщение Merlin » 13 дек 2006, 16:54

ARM писал(а): есть данные в таблице, которые выстраиваются в такое дерево:

- Root
| Level1
| | Item1
| Level2
| | Item2

Нужно, чтобы в результате выборки у меня данные выстроились в след. порядке: Root, Level1, Level2, Item1, Item2.
А тащи их вдоль как умеешь, а пОперек разворачивай на клиенте, хоть с помощью TClientDataset.

Вот собственно и все!
ARM писал(а):
2) Id могут идти не по-порядку
А это вообще никого никогда не волнует.

ARM
Сообщения: 26
Зарегистрирован: 02 дек 2006, 13:27

Re: Выборка древовидных данных

Сообщение ARM » 13 дек 2006, 17:14

Сорри, не уточнил: этот набор данных нужен мне только на серваке, поэтому делать запрос "плоских данных" на клиенте, а потом отдавать их серверу думаю будет пустой тратой трафика.
Merlin писал(а):есть данные в таблице, которые выстраиваются в такое дерево:

- Root
| Level1
| | Item1
| Level2
| | Item2

Нужно, чтобы в результате выборки у меня данные выстроились в след. порядке: Root, Level1, Level2, Item1, Item2.


А тащи их вдоль как умеешь, а пОперек разворачивай на клиенте, хоть с помощью TClientDataset.

Вот собственно и все!

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 13 дек 2006, 20:56

А зачем серверу лично нужны развёрнутые данные, собсно? Что он с них намерен получить? Кубы и кросс-табы делаются на клиенте... Ну можешь свалить в длинные строки в SP, и парсить их потом, параметры-то с переменными всё равно динамически создавать не сможешь. В общем в консерватории тут что-то не то с результатом в виде проктологии.

ARM
Сообщения: 26
Зарегистрирован: 02 дек 2006, 13:27

Сообщение ARM » 14 дек 2006, 10:20

Merlin писал(а):А зачем серверу лично нужны развёрнутые данные, собсно? Что он с них намерен получить? Кубы и кросс-табы делаются на клиенте... Ну можешь свалить в длинные строки в SP, и парсить их
Свалить что ? сумбурную (неупорядоченную) выборку из этого дерева ? Дык это мне и даром не надо. Надо именно упорядоченную, а там хоть в строку, хоть через практолога.
Merlin писал(а):потом, параметры-то с переменными всё равно динамически создавать не сможешь. В общем в консерватории тут что-то не то с результатом в виде проктологии.
Да нет Мерлин, с консерваторией тут все ок, а специалистом по задницам и не пахнет.
Мой пример, например, это когда у узла (ветки) дерева на сервере меняется какой-то параметр, от которого зависят вложенные листья этого узла. Соотв. для вложенных листьев эти параметры тож нужно пересчитать. Варианты есть, но так красиво, как на M$, сделать смотрю не судьба.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 14 дек 2006, 10:26

ARM писал(а):Мой пример, например, это когда у узла (ветки) дерева на сервере меняется какой-то параметр, от которого зависят вложенные листья этого узла. Соотв. для вложенных листьев эти параметры тож нужно пересчитать.
Во-первых, для этой задачи нафиг не сдался упорядоченный набор данных в котором будет "все сразу". Достаточно пнуть рекурсивную комбинацию из триггеров и/или ХП.
Во-вторых, этот пример попахивает хранимыми агрегатами, которые есть "last resort". Т.е. НЗ.

ARM
Сообщения: 26
Зарегистрирован: 02 дек 2006, 13:27

Сообщение ARM » 14 дек 2006, 10:35

Dimitry Sibiryakov писал(а):Во-первых, для этой задачи нафиг не сдался упорядоченный набор данных в котором будет "все сразу". Достаточно пнуть рекурсивную комбинацию из триггеров и/или ХП.
Этот вариант в голове засел один из первых. Может есть более красивый. Опять таки сравниваю с МС Сиквелом.
Dimitry Sibiryakov писал(а):Во-вторых, этот пример попахивает хранимыми агрегатами, которые есть "last resort". Т.е. НЗ.
Что есть "последний ресорт" и "НЗ" ? Консерваторий по Сиквелу не заканчивал! :)

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 14 дек 2006, 10:37

Красота - понятие относительное.
Last resort - последнее средство, к которому прибегают только после того как все остальное не сработало.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 14 дек 2006, 11:09

ARM писал(а):Этот вариант в голове засел один из первых. Может есть более красивый. Опять таки сравниваю с МС Сиквелом
А что такое - красивый ? То, что "красиво" в одном инструменте, может быть "уродливо" в другом.
Временные таблицы тут не требуются, но, если думать иначе уже не умеешь, то никто не запрещает эмулировать временную таблицу с помощью постоянной.

ARM
Сообщения: 26
Зарегистрирован: 02 дек 2006, 13:27

Сообщение ARM » 14 дек 2006, 11:20

hvlad писал(а):Временные таблицы тут не требуются, но, если думать иначе уже не умеешь, то никто не запрещает эмулировать временную таблицу с помощью постоянной.
Вопрос закрыт. Реализовано рекурсией, желающим могу показать код (дабы не засорять форум). Всем спасибо.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 дек 2006, 11:35

Реализовано рекурсией, желающим могу показать код (дабы не засорять форум). Всем спасибо.
наверное и не надо. рекурсий полно и в статьях про деревья в www.ibase.ru/develop.htm

Ответить