![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос построить [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]СУБД какая?