Знатокам SQL. Возможна ли рекурсия или что-то подобное

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Vladgul
Сообщения: 12
Зарегистрирован: 01 дек 2004, 16:07

Знатокам SQL. Возможна ли рекурсия или что-то подобное

Сообщение Vladgul » 13 май 2011, 19:35

Доброго времени суток!

Помогите решить проблему.
Есть БД. В которой реализуется древовидная структура
Назовем таблицу Table1
поля
ID
ParentID
Pole1
..
PoleN
Логически дочерняя запись ссылается на родителя указывая его ID в поле ParentID

Есть другая таблица, в которой содержатся переодически пополняемые данные.
Назовем Table2
Поля
LinkID - ссылка на первую таблицу для задания связи типа N:1
Pole2_1
...
Pole2_N

Проблема заключается в следующем. Нужно сделать выборку по таблицам, с условием
для всех записей таблицы Table2 (Table2.Pole2_2>=константа1) - базовое условие, например данные интересуют после определенной даты
and (Table2.Pole2_1>0) - дополнительное условие, данные отличны от нуля
по этим данным нужно найти запись в родительской таблице. (В этом ничего сложного для меня пока нет)

А дальше в результирующую выборку должны попасть ВСЕ родительские записи по ссылкам ParentID даже, если условия (Table2.Pole2_2>=константа1) and (Table2.Pole2_1>0) не выполняются. И самое главное что должна быть построена вся цепочка родительских записей, т.е. должно получиться что-то подобное:
  • Название         Pole1        Pole2 .....
     Запись1             0         13.05.2011 .....
       Запись2           0         13.05.2011
          Запись3        1         13.05.2011 - записи относящиеся к одному родителю
          Запись31      4         13.05.2011
       Запись4           2         13.05.2011
       Запись5           2         13.05.2011
          Запись6        5         13.05.2011
          Запись7        0         13.05.2011
             Запись8     1         13.05.2011
Глубина такой вложенности может быть достаточно большой, например больше 40 уровней иерархии.

Подскажите, пожалуйста, можно ли сделать такой запрос средствами SQL (хранимыми процедурами?) или другим способом, но именно на стороне БД.

Надеюсь, что понятно объяснил суть.
Спасибо.

AndreyTarasov
Сообщения: 7
Зарегистрирован: 12 окт 2009, 09:20

Re: Знатокам SQL. Возможна ли рекурсия или что-то подобное

Сообщение AndreyTarasov » 21 май 2011, 06:21

Можно
я использую 2 процедуры и join к последней

вот диплом помогал делать - выглядит так

Код: Выделить всё

create procedure MAKE_TREE ( KOD integer) returns ( RET integer)
as
begin
    for select k.id_kl from klassifikator k where k.id_rod=:kod order by k.name_klass
    into :ret do
        begin
        suspend;
        for select * from make_tree (:ret) into :ret do suspend;
        end
end

Код: Выделить всё

create procedure MAKE_TREE_FULL ( KOD integer) returns ( RET integer)
as
begin
    ret=kod;
    suspend;
    for select ret from MAKE_TREE(:kod) into :ret do suspend;
end

Код: Выделить всё

select k.* from make_tree_full(:klass) t
left join ED_KLASIFIK k on k.id_klass =t.ret
where k.id is not null
order by k.name

Vladgul
Сообщения: 12
Зарегистрирован: 01 дек 2004, 16:07

Re: Знатокам SQL. Возможна ли рекурсия или что-то подобное

Сообщение Vladgul » 22 май 2011, 00:05

Спасибо за ответ.
Не сочтите за труд помочь разобраться.
Используя только первую процедуру (немного подправив поля) я смог пройти по цепочке родительских связей до конца (т.е. до главного родительского элемента).
Дальше запутался.
Мне надо чтобы в результирующей выборке были данные всех полей записи Table1 для которых выполняется условие (Table2.Pole2_1>0) и при этом всём, чтобы была выстроена вся цепочка родительских элементов (уже без всяких условий).
При этом непонятно как сделать, чтобы не передавать никаких параметров в запрос, т.к. данные для этого параметра уже должны быть получены путем выполнения условия первичного отбора данных (Table2.Pole2_1>0).
Также не понятно, что будет отображаться, если будут удовлетворять первичному условию две записи с одного уровня иерархии, то в результирующей таблице будет выбрана вся цепочка иерархической структуры для КАЖДОЙ записи? или нет? Не хочется, чтобы дублировались родительские записи.
Я буду признателен, если вы сможете мне объяснить как это работает.
Спасибо.

AndreyTarasov
Сообщения: 7
Зарегистрирован: 12 окт 2009, 09:20

Re: Знатокам SQL. Возможна ли рекурсия или что-то подобное

Сообщение AndreyTarasov » 22 май 2011, 13:54

процедура MAKE_TREE возвращает список дочерних идентификаторов для указанного родителя в Table1
процедура MAKE_TREE_FULL возвращает идентификатор родителя + список дочерних идентификаторов для указанного родителя в Table1

когда вы щелкаете по элементу дерева - вы передаете код элемента в запрос, вам выдается список для выделенного элемента(родителя) и всех дочерних элементов
осталось только к данному списку привязать соответствующие элементы Table2

PS: у меня в дерево всегда начинается с элемента "Все", который имеет код - "0" ну и в таблицах не храниться

Ответить