Страница 1 из 1

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

Добавлено: 13 дек 2006, 16:49
ARM
Привет.

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

Добавлено: 14 дек 2006, 10:37
Dimitry Sibiryakov
Красота - понятие относительное.
Last resort - последнее средство, к которому прибегают только после того как все остальное не сработало.

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

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

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