![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите красиво выбрать иерархические данные.
Delph1 © (2003-06-10 09:09:00)Имеется таблица структуры:
ID NUMBER(10) - Идентификатор
IDPARENT NUMBER(10) - Идентификатор вышестоящего
NAMES VARCHAR2(100) - Наименование
Обычная таблица для иерархических данных
Имеется N произвольно выбранных значений идентификаторов - из разных мест таблицы. Необходимо выбрать все записи, образующее дерево, на концах веток которого находятся узлы с указанными идентификаторами, т.е. выбрать указанные N записей и всех их предков. В результирующем наборе записи по ID повторяться не должны.
Спасибо.
Наталия (2003-06-10 10:23:00) [1]Sergey13 © (10.06.03 10:17)
Да, ты прав. Освежила память. Совсем плоха стала... :))
Sergey13 (2003-06-10 10:17:00) [2]2Наталия © (10.06.03 10:07)
Изменяет вам память, Наташа. Тут все зависит от prior - что справа от = то и ищет. 8-)
Delph1 (2003-06-10 10:17:00) [3]Все работает! Спасибо. Sergey13 - мастер :)
Delph1 (2003-06-10 10:11:00) [4]> Sergey13 ©
> Start with id in
Так можно? Пробую...
Sergey13 (2003-06-10 10:08:00) [5]2Delph1 (10.06.03 09:54)
>Сделал склейку запросов через UNION.
А зачем? Start with id in (твой перечень нужных узлов)
Наталия (2003-06-10 10:07:00) [6]Что-то ты путаешь...
Насколько мне не изменяет память connect by... находит не предков, а всех потомков.
Для поиска предков я писала простенькую рекурсивную функцию. На вход можно передать массив нужных id.
Delph1 (2003-06-10 10:04:00) [7]UNION. Обьединение отдельных запросов для каждого идентификатора. При возрастании N растет время на формирование, разбор и выполнение запроса, да и размер запроса растет... Возможны ситуации, когда N = 500, а количество записей во всей таблице поряка 20000.
Johnmen (2003-06-10 09:58:00) [8]>Но не думаю, что это лучший способ.
Что именно ? connect by prior, start with или UNION ?
Delph1 (2003-06-10 09:54:00) [9]Oracle. На SQL. Есть способ для получения всех предков для указанного узла - connect by prior, start with. Сделал склейку запросов через UNION. Но не думаю, что это лучший способ. Хотелось бы узнать, может еще способы есть?
KSergey (2003-06-10 09:32:00) [10]Ну а это, слегка напрячься - не судьба?
Нужно оешение на SQL или как?
Johnmen (2003-06-10 09:32:00) [11]Зависит от БД...
passm (2003-06-10 09:31:00) [12]Delph1 (10.06.03 09:09)> Пахнет рекурсивным запросом :)
СУБД?