Выборка древовидных данных
Выборка древовидных данных
Привет.
Есть проблема, которую сам решить пока не могу. Может кто что подскажет.
ДАНО: таблица (Id, ParentId), т.е. элементарное дерево.
ВОПРОС: Нужно выбрать СРАЗУ (в один набор данных) все данные, выстроенные по псевдо-уровням дерева. Почему псевдо, потому что как такового поля Level в табл. нет. Что значит "выстроенные по псевдо-уровням" - т.е. есть данные в таблице, которые выстраиваются в такое дерево:
- Root
| Level1
| | Item1
| Level2
| | Item2
Нужно, чтобы в результате выборки у меня данные выстроились в след. порядке: Root, Level1, Level2, Item1, Item2.
Вот собственно и все!
ЗЫ: 1) В MSSQL это можно решить с пом. временных таблиц, но в ФБ их нет (пока, но ждать не могу).
2) Id могут идти не по-порядку
3) данные нужны в одном наборе данных, а не поэтапно! Хотя "поэтапно" это все равно приходит к исп. временных таблиц.
Есть проблема, которую сам решить пока не могу. Может кто что подскажет.
ДАНО: таблица (Id, ParentId), т.е. элементарное дерево.
ВОПРОС: Нужно выбрать СРАЗУ (в один набор данных) все данные, выстроенные по псевдо-уровням дерева. Почему псевдо, потому что как такового поля Level в табл. нет. Что значит "выстроенные по псевдо-уровням" - т.е. есть данные в таблице, которые выстраиваются в такое дерево:
- Root
| Level1
| | Item1
| Level2
| | Item2
Нужно, чтобы в результате выборки у меня данные выстроились в след. порядке: Root, Level1, Level2, Item1, Item2.
Вот собственно и все!
ЗЫ: 1) В MSSQL это можно решить с пом. временных таблиц, но в ФБ их нет (пока, но ждать не могу).
2) Id могут идти не по-порядку
3) данные нужны в одном наборе данных, а не поэтапно! Хотя "поэтапно" это все равно приходит к исп. временных таблиц.
Re: Выборка древовидных данных
А тащи их вдоль как умеешь, а пОперек разворачивай на клиенте, хоть с помощью TClientDataset.ARM писал(а): есть данные в таблице, которые выстраиваются в такое дерево:
- Root
| Level1
| | Item1
| Level2
| | Item2
Нужно, чтобы в результате выборки у меня данные выстроились в след. порядке: Root, Level1, Level2, Item1, Item2.
Вот собственно и все!
А это вообще никого никогда не волнует.ARM писал(а):
2) Id могут идти не по-порядку
Re: Выборка древовидных данных
Сорри, не уточнил: этот набор данных нужен мне только на серваке, поэтому делать запрос "плоских данных" на клиенте, а потом отдавать их серверу думаю будет пустой тратой трафика.
Merlin писал(а):есть данные в таблице, которые выстраиваются в такое дерево:
- Root
| Level1
| | Item1
| Level2
| | Item2
Нужно, чтобы в результате выборки у меня данные выстроились в след. порядке: Root, Level1, Level2, Item1, Item2.
А тащи их вдоль как умеешь, а пОперек разворачивай на клиенте, хоть с помощью TClientDataset.
Вот собственно и все!
А зачем серверу лично нужны развёрнутые данные, собсно? Что он с них намерен получить? Кубы и кросс-табы делаются на клиенте... Ну можешь свалить в длинные строки в SP, и парсить их потом, параметры-то с переменными всё равно динамически создавать не сможешь. В общем в консерватории тут что-то не то с результатом в виде проктологии.
Свалить что ? сумбурную (неупорядоченную) выборку из этого дерева ? Дык это мне и даром не надо. Надо именно упорядоченную, а там хоть в строку, хоть через практолога.Merlin писал(а):А зачем серверу лично нужны развёрнутые данные, собсно? Что он с них намерен получить? Кубы и кросс-табы делаются на клиенте... Ну можешь свалить в длинные строки в SP, и парсить их
Да нет Мерлин, с консерваторией тут все ок, а специалистом по задницам и не пахнет.Merlin писал(а):потом, параметры-то с переменными всё равно динамически создавать не сможешь. В общем в консерватории тут что-то не то с результатом в виде проктологии.
Мой пример, например, это когда у узла (ветки) дерева на сервере меняется какой-то параметр, от которого зависят вложенные листья этого узла. Соотв. для вложенных листьев эти параметры тож нужно пересчитать. Варианты есть, но так красиво, как на M$, сделать смотрю не судьба.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Во-первых, для этой задачи нафиг не сдался упорядоченный набор данных в котором будет "все сразу". Достаточно пнуть рекурсивную комбинацию из триггеров и/или ХП.ARM писал(а):Мой пример, например, это когда у узла (ветки) дерева на сервере меняется какой-то параметр, от которого зависят вложенные листья этого узла. Соотв. для вложенных листьев эти параметры тож нужно пересчитать.
Во-вторых, этот пример попахивает хранимыми агрегатами, которые есть "last resort". Т.е. НЗ.
Этот вариант в голове засел один из первых. Может есть более красивый. Опять таки сравниваю с МС Сиквелом.Dimitry Sibiryakov писал(а):Во-первых, для этой задачи нафиг не сдался упорядоченный набор данных в котором будет "все сразу". Достаточно пнуть рекурсивную комбинацию из триггеров и/или ХП.
Что есть "последний ресорт" и "НЗ" ? Консерваторий по Сиквелу не заканчивал!Dimitry Sibiryakov писал(а):Во-вторых, этот пример попахивает хранимыми агрегатами, которые есть "last resort". Т.е. НЗ.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
А что такое - красивый ? То, что "красиво" в одном инструменте, может быть "уродливо" в другом.ARM писал(а):Этот вариант в голове засел один из первых. Может есть более красивый. Опять таки сравниваю с МС Сиквелом
Временные таблицы тут не требуются, но, если думать иначе уже не умеешь, то никто не запрещает эмулировать временную таблицу с помощью постоянной.
наверное и не надо. рекурсий полно и в статьях про деревья в www.ibase.ru/develop.htmРеализовано рекурсией, желающим могу показать код (дабы не засорять форум). Всем спасибо.