![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
А с таким запросом как?
}|{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]
> И вообще, это Оракул извратился над стандартным синтаксисом...
Но в Оракуле так же оставлен и стандартный синтаксис