Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Знатокам SQL посвящается... [D5, WinXP]


Leonon ©   (2002-10-31 15:59:00) 

Привет, Уважаемые Мастера! Есть Таблица1, которая организует древовидную иерархию по двум полям ID и ParentID. Задача выбрать все записи, которые находятся в подчинении у заданной. В Oracle это просто, путем следующего запроса:
SELECT * FROM NODES CONNECT BY PRIOR ParentID=ID
START WHITH ID=N /*где N номер узла*/. Однако в Local SQL такой фишки нет. Как грамотно построить запрос, если число подчинений за ранее не известно???


Jeer   (2002-10-31 17:59:00) [1]

Delirium © (31.10.02 16:34)
"Можно, но не всегда эффективно" - пример, пожалуйста

Не точно выразился (пропустил уточнение) - можно построить эквивалент такого запроса использованием двух раздельных SELECT и
обходом дерева на клиенте.
Если SQL engine не имеет таких возможностей.


MMF   (2002-10-31 17:41:00) [2]

http://sdm.viptop.ru/articles/sqltrees.html
http://mathc.chat.ru/a3/articl03.htm
http://www.j2.ru/frozenfido/ru.algorithms/143013c9b96ef.html
Дома у меня есть еще ссылки, я довольно плотно этой темой занимался. Вначале пошел по неверному пути матрицы смежности (чего тебе делать не советую) - в дереве размером в 18000 элементов уже было заметно медленно суммирование параметра от произвольного узла, вычисление высоты поддерева и др. делал на InterBase6.


Leonon   (2002-10-31 17:18:00) [3]

2 Jeer

Я тебя понял.


Leonon   (2002-10-31 17:04:00) [4]

Причем задача решается просто, если знать, что колличество вложений не привышает зааданное число. Так как быть?

Jeer, а что находится в скобках WHERE ID IN ( ? )


Delirium   (2002-10-31 16:34:00) [5]

"Можно, но не всегда эффективно" - пример, пожалуйста


Jeer   (2002-10-31 16:31:00) [6]

Можно, но не всегда эффективно.

Рекурсивно заполняется TTreeView на основе ID и PARENT, что м.б. громоздко, но если записей не много - то терпимо.
Далее, по TTreeView строится ветка вниз или вверх и формируется строка с нужными ID

Далее - SELECT ... WHERE ID IN (...)


Delirium   (2002-10-31 16:16:00) [7]

В Local SQL действительно невозможно построить адекватный такой задаче запрос. Остаётся фильтровать TDataSet.


3JIA9I CyKA   (2002-10-31 16:04:00) [8]

Удалено модератором


Наверх

Титульная страница Поиск, карта сайта Написать письмо