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

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

А с таким запросом как?


Страницы:   1 2

}|{yk ©   (2004-04-19 14:20:00) 

В оракле делаю так
SELECT a.set_id, a.mem_id, a.mem_pid, b.mem_name
 FROM cust1_tree a,cust1 b,cust1 c
 where a.mem_id=b.mem_id and a.mem_pid=c.mem_id(+)
 order by a.mem_pid,a.mem_order

(+) - чтобы выводились и корневые элементы, не имеющие родителей
(+) в Interbase нет, чем его можно заменить?


Курдль   (2004-04-19 16:06:00) [1]


> 1 (!) запросом я построю дерево

Вы не построите дерево! А лишь список связей "предок-потомок". Причем размер НД увеличится, кратно степени иерархии.


Vlad   (2004-04-19 15:41:00) [2]

хм... действительно, поглядел в интернете, везде написано что left join в 8i не поддерживается. Однако у меня довольно очетливо осталось в памяти, что сам лично пользовался такой конструкцией на 8-м Оракле.... Переутомился наверное....


}|{yk   (2004-04-19 15:34:00) [3]

когда я построю такле дерево, то 1 (!) запросом я построю дерево, и построение его на клиенте будет занимать только 1 проход по созданному запросу


}|{yk   (2004-04-19 15:29:00) [4]

Вот так вот
SELECT a.set_id, a.mem_id, a.mem_pid, b.mem_name CHILD_NAME,c.mem_name PARENT_NAME
 FROM cust1_tree a
 left join cust1 b
 ON (a.mem_id=b.mem_id)
 left join cust1 c
 ON (a.mem_pid=c.mem_id)
Работает правильно


Курдль   (2004-04-19 15:26:00) [5]

Кстати, если Ваша цель построить "дерево", то какие дальнейшие планы? Ну, получите набор данных вида:
а1 - в2
а1 - в3
а2 - в5
а2 - в6
а3 - в7
а3 - в8
а9 - в10
...
И что дальше? На клиенте будете дерево строить? Так не лучше ли просто взять 2 НД - cust1_tree и cust1, чтобы просто построить дерево в памяти и не мучать сервер многократным выбором одних и  тех же значений?


Danilka   (2004-04-19 15:21:00) [6]

[19] Johnmen ©   (19.04.04 15:13)
понятно.
значит, лишнего писал, эх блин! :))


Соловьев   (2004-04-19 15:15:00) [7]


> }|{yk ©   (19.04.04 15:11) [18]

http://www.ibase.ru/develop.htm


Johnmen   (2004-04-19 15:13:00) [8]

>Danilka ©   (19.04.04 15:05) [17]

[INNER] JOIN | {LEFT | RIGHT | FULL } [OUTER]} JOIN


}|{yk   (2004-04-19 15:11:00) [9]

>то содержать лишнюю таблицу для поддержки древовидной связи
>бессмысленно - проще сделать свяь в единственной таблице
>один-ко-многим на саму себя.

Кроме того в этой таблице храняться идентификаторы версий - есть различные иерархии элементов. Элементы могут входить в различные иерархии (удобно, чтобы не добавлять новые поля, а просто добавлять новую иерархию и добавлять существующие элементы в новую иерархию).
Но данной конкретной таблице иерархия пока одна, потому в запросе я ее пропустил


Danilka   (2004-04-19 15:05:00) [10]

[15] Johnmen ©   (19.04.04 15:02)
в восьмерке на самом деле нет.

[6] Johnmen ©   (19.04.04 14:43)
на самом деле этого достаточно? может left outer join?


Курдль   (2004-04-19 15:05:00) [11]


> но соединение не 1, а 2 - в таблице cust1 хранятся объекты,
> а в cust1_tree - связи

Вы чего-то не договариваете! Если условие в исходном запросе не усечено:

where a.mem_id=b.mem_id and a.mem_pid=c.mem_id(+)
order by a.mem_pid,a.mem_order

то содержать лишнюю таблицу для поддержки древовидной связи бессмысленно - проще сделать свяь в единственной таблице один-ко-многим на саму себя.


DenK_vrtz   (2004-04-19 15:02:00) [12]

с девятки есть join и outer join :)


Johnmen   (2004-04-19 15:02:00) [13]

>Vlad ©   (19.04.04 14:59) [12]
>Есть и join и outer join :-)

По-моему, ты вводишь старого склеротика в заблуждение...(<=8 версия)
:)


Johnmen   (2004-04-19 15:00:00) [14]

>многие условия стандартным языком не описать.
>Например:
>WHERE A.ID(+)= B.ID
>AND B.ID(+)= C.ID
>AND C.ID(+)= D.ID
>AND D.ID(+)= E.ID
>AND E.ID(+)= F.ID

FROM A
LEFT JOIN B ON B.ID= A.ID
LEFT JOIN C ON C.ID= B.ID
LEFT JOIN D ON D.ID= C.ID
LEFT JOIN E ON E.ID= D.ID
LEFT JOIN F ON F.ID= E.ID
:)


Vlad   (2004-04-19 14:59:00) [15]


> Johnmen ©   (19.04.04 14:54) [9]

Есть и join и outer join :-)


sniknik   (2004-04-19 14:58:00) [16]

Johnmen ©   (19.04.04 14:43) [6]
> И вообще, это Оракул извратился над стандартным синтаксисом...
не только он в Perwasive вместо LEFT JOIN есть =+ (или наоборот +=), почти оракул только без скобочек. ;)


}|{yk   (2004-04-19 14:56:00) [17]

Дык... Непонятно
как же это-то запрос переписать под Interbase?
Ведь здесь хотя и объединяются 2 таблицы, но соединение не 1, а 2 - в таблице cust1 хранятся объекты, а в cust1_tree - связи


Johnmen   (2004-04-19 14:54:00) [18]

>Но в Оракуле так же оставлен и стандартный синтаксис

В 8 версии разве есть JOIN ?
:)


Курдль   (2004-04-19 14:53:00) [19]


> И вообще, это Оракул извратился над стандартным синтаксисом...

Иногда стандартного синтаксиса не хватает. Sybase, например, для этих целей использует TransactSQL, в нем бы числилось WHERE A.ID *= B.ID
Но это не для того, чтобы помочь ленивым в записи "...outer join", - просто многие условия стандартным языком не описать.
Например:

WHERE A.ID(+)= B.ID
AND B.ID(+)= C.ID
AND C.ID(+)= D.ID
AND D.ID(+)= E.ID
AND E.ID(+)= F.ID


Vlad   (2004-04-19 14:52:00) [20]


> И вообще, это Оракул извратился над стандартным синтаксисом...

Но в Оракуле так же оставлен и стандартный синтаксис


Страницы:   1 2

Наверх

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