Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > выбор по древовидной структуре


Автор: 17dufa 16.2.2010, 17:08
Есть таблица T1:
T1_ID int - PK
T1_Parent int
Value char(10)

Есть таблица T2:
T2_ID int - PK
T1_ID int - FK

через T1_Parent записи таблицы T1 организованы в дерево.

Теперь задача: есть запись в T2 (то есть есть ее T2_ID) и есть некая символьная маска. Задача - как узнать, есть ли среди записей T1 такая, что:
1. Value удовлетворяет маске
2. T1_ID из имеющейся записи в T2 ссылается либо на данную запись T2, либо на одну из дочерних записей (дочерних в смысле того дерева, в которое организована T1)

например:
Т1:
1 0 "oooo"
2 1 "aaa"

T2:
1 2

теперь предположим, что рассматривается запись T2 = {1,2} и задана маска "o%". Тогда запись T1 = {1,0,"oooo"} - искомая.



Автор: Gluttton 16.2.2010, 23:32
В MS SQL Server и Firebird (с другими СУБД просто не сталкивался) для перебора древовидных структур можно использовать рекурсивные запросы. Для осуществления выбора по маске можно рекурсивный запрос реализовать в виде хранимой процедуры, а сам выбор по маске осуществлять тривиальным select'ом к этой хранимой процедуре.
http://forum.vingrad.ru/index.php?showtopic=276790&view=findpost&p=1998789 реализации хранимых процедур для выборки, вставки и удаления при древовидной организации хранения данных.

Автор: Zloxa 17.2.2010, 14:55
Цитата(Gluttton @  16.2.2010,  23:32 Найти цитируемый пост)
(с другими СУБД просто не сталкивался

рекусрсивные запросы реализованы так же в db2, postgree, оракле с 11й версии(до 11й  в оракле реализованы иерархические запросы)
Цитата(Gluttton @  16.2.2010,  23:32 Найти цитируемый пост)
можно рекурсивный запрос реализовать в виде хранимой процедуры

нипонял зачем. Дерево формируешь в кекурсивном with а в селекте - отбор по маске....

Автор: Gluttton 17.2.2010, 15:40
Цитата(Zloxa @  17.2.2010,  14:55 Найти цитируемый пост)
нипонял зачем.

Ну типа, что бы запрос выглядел ну-у-у о-о-очень просто:
Код

select * 
from sp
    where ca="mask"

Ну это так smile , типа инкапсуляции smile ...

Автор: 17dufa 17.2.2010, 17:41
мдась. было у мя подозрение, что это все не просто. 

Автор: Zloxa 17.2.2010, 17:47
а помому все просто  smile 

Наверное мы говорим о разных платформах ;)

Автор: Gluttton 17.2.2010, 17:56
17dufa, вот http://forum.vingrad.ru/index.php?showtopic=273104&view=findpost&p=1968873 мы со Zloxa упражнялись в рекурсии...
Вы начните, а там, когда вопросы будут по конкретнее думаю поможем smile ...
 

Автор: 17dufa 18.2.2010, 11:49
как нить на досуге для общего развития поупражняюсь. 
наш Oracle RDB к сожалению слова recursive не кушает
*тока не надо мне грить, что Oracle RDB - это зло, я это и сам знаю smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)