Вниз
Скачать: CL | DM;

Знатокам SQL посвящается...   Найти похожие ветки 

← →
Leonon   (2002-10-31 15:59) [0]

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


← →
3JIA9I CyKA ©   (2002-10-31 16:04) [1]

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


← →
Delirium ©   (2002-10-31 16:16) [2]

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


← →
Jeer ©   (2002-10-31 16:31) [3]

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

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

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


← →
Delirium ©   (2002-10-31 16:34) [4]

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


← →
Leonon   (2002-10-31 17:04) [5]

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

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


← →
Leonon   (2002-10-31 17:18) [6]

2 Jeer

Я тебя понял.


← →
MMF ©   (2002-10-31 17:41) [7]

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.


← →
Jeer ©   (2002-10-31 17:59) [8]

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

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.013 c
3-69203
Alek_1
2002-10-23 01:44
2002.11.21
Индексы в парадоксе!


14-69566
Oleg_Gashev
2002-11-04 01:07
2002.11.21
Занимательные задачи-2


6-69475
Ник Я
2002-09-24 15:48
2002.11.21
Хочу все время видеть на сколько загр. ОЗУ, может кто функцию зна


1-69426
Vetalar
2002-11-10 21:47
2002.11.21
Как ограничить количество знаков после запятой?


14-69516
Cr@sh
2002-11-01 17:34
2002.11.21
Мастера, помогите... не то я с собой че-нибудь сделаю...




   Наверх