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

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

Запрос построить [D7]


rar ©   (2007-01-18 17:53:00) 

Есть таблица РАЗДЕЛЫ иерархической структуры

ID_Tom
Tom
ID_Parent

для коневого узла ID_Parent=0.

Есть подчиненная таблица ХАРАКТЕРИСТИКИ

ID_Character
ID_Tom
NomNumber

необходимо в таблице РАЗДЕЛЫ отобрать данные по условию:

ID_Parent=0;
NomNumber Like'6%'

т.е. выбрать корневые узлы (ID_Parent=0;) которые являются родителем для NomNumber Like'6%'.
Можно ли это выбрать одним запросом.
Уф вроде все :-)


rar   (2007-01-19 18:05:00) [1]

К сожалению запрос оказался путым :-((


> ANB ©   (18.01.07 20:01) [6]


На его основе написал вот это:

SELECT * from Toms Tm
WHERE Tm.id_Tom IN(SELECT DISTINCT Tm.Id_parent
 from Toms, characters
                  where characters.Id_tom = Toms.Id_tom
                    and Nomnumber like '6%')
start with Tm.Id_parent=0
connect by Tm.Id_tom= PRIOR Tm.Id_parent

он и выдал то что нужно, надеюсь :-), правда работает не быстро, но похоже с деревьями всегда так

Всем Большое  Спасибо


ANB   (2007-01-19 10:28:00) [2]


> Мне надо было получить именно корень

Мой последный запрос тащит именно корни, если в нем самом или в любой его ветке есть характеристика, начинающаяся с 6.


rar   (2007-01-18 21:25:00) [3]

СУБД Oracle

Мне надо было получить именно корень

Завтра попробую рекомендации

> ANB ©   (18.01.07 20:01) [6]

Может действительно получу корни

Большое всем спасибо


ANB   (2007-01-18 20:02:00) [4]


> Sybase))))))

В теме СУБД не указана. Значит пусть ставит оракл и наслаждается :)


ANB   (2007-01-18 20:01:00) [5]

create table Toms
(
ID_Tom integer,
Tom varchar2(200),
ID_Parent integer
)

create table Characters
(
ID_Character integer,
ID_Tom       integer,
NomNumber    varchar2(200)
)

Запрос с учетом дерева (Оракл) :

select *
 from Toms Tm
where Tm.Id_parent = 0
  and exists (select     1
                    from Toms, characters
                   where characters.Id_tom = Toms.Id_tom
                     and Nomnumber like '6%'
              start with Toms.Id_tom = Tm.Id_tom
              connect by Toms.Id_parent = prior Toms.Id_tom)


Комбинатор   (2007-01-18 19:41:00) [6]


> С раскруткой можно сделать только на оракле.

Sybase))))))


ANB   (2007-01-18 19:40:00) [7]


> SELECT * FROM РАЗДЕЛЫ, ХАРАКТЕРИСТИКИ
> WHERE
> (РАЗДЕЛЫ.ID_Tom=ХАРАКТЕРИСТИКИ.ID_Tom) AND
> (РАЗДЕЛЫ.ID_Parent=0) AND
> (ХАРАКТЕРИСТИКИ.NomNumber Like'6%')

Дубли


> SELECT DISTINCT(РАЗДЕЛЫ.ID_Tom) FROM РАЗДЕЛЫ, ХАРАКТЕРИСТИКИ
> WHERE
> (РАЗДЕЛЫ.ID_Parent=0) AND
> (РАЗДЕЛЫ.ID_Tom=ХАРАКТЕРИСТИКИ.ID_Tom) AND
> (ХАРАКТЕРИСТИКИ.NomNumber Like'6%')

disticnt спасает, но можно и проще

Однако никак не учитывается, что корень может быть не непосредственным хозяином характеристики. Если это нужно учитывать - то надо раскручивать дерево.

SELECT * FROM РАЗДЕЛЫ
WHERE
РАЗДЕЛЫ.ID_Parent=0 AND
РАЗДЕЛЫ.ID_Tom in
(
select ХАРАКТЕРИСТИКИ.ID_Tom from ХАРАКТЕРИСТИКИ
where ХАРАКТЕРИСТИКИ.NomNumber Like'6%'
)
это без раскрутки дерева.

С раскруткой можно сделать только на оракле.


Комбинатор   (2007-01-18 19:25:00) [8]

SELECT DISTINCT(РАЗДЕЛЫ.ID_Tom) FROM РАЗДЕЛЫ, ХАРАКТЕРИСТИКИ
WHERE
(РАЗДЕЛЫ.ID_Parent=0) AND
(РАЗДЕЛЫ.ID_Tom=ХАРАКТЕРИСТИКИ.ID_Tom) AND
(ХАРАКТЕРИСТИКИ.NomNumber Like'6%')


Johnmen   (2007-01-18 18:53:00) [9]

Так тривиальное соединение
SELECT * FROM РАЗДЕЛЫ, ХАРАКТЕРИСТИКИ
WHERE
(РАЗДЕЛЫ.ID_Tom=ХАРАКТЕРИСТИКИ.ID_Tom) AND
(РАЗДЕЛЫ.ID_Parent=0) AND
(ХАРАКТЕРИСТИКИ.NomNumber Like'6%')


Desdechado   (2007-01-18 18:20:00) [10]

СУБД какая?


Наверх

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