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

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

SELECT из большого числа таблиц [D6, IB6.x, FireBird]


galexis ©   (2003-03-20 12:33:00) 

Уважаемые мастера! Подскажите как правильно составить SQL запрос на отбор записи из большого числа таблиц связанных по разным полям. Делаю так:
SELECT A.fld1,B.fld2,C.fld3,D.fld4,E.fld5 from Tbl1 A, Tbl2 B, Tbl3 C, Tbl4 D, Tbl5 E where A.fld6=123 AND B.fld7=A.fld6
AND C.fld8=A.fld6 AND D.fld9=C.fld10 AND E.fld11=C.fld12


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


zacho   (2003-03-21 10:17:00) [1]


> Johnmen © (21.03.03 09:34)

Могу еще добавить, что неявный join в виде SELECT .. FROM TABLE1, TABLE2, .. WHERE .. действительно может ускорить выполнение запроса, но это зависит от версии IB и индексов.


Johnmen   (2003-03-21 09:34:00) [2]

>eugie © (21.03.03 07:36)

Могу ответственно заявить, что явные соединения (JOIN) работуют быстрее неявных в виде вложенных запросов...
И во-вторых, на так называемый тобою "порядок просмотра" влияет наличие индексов, а не всякие Order By...


eugie   (2003-03-21 07:36:00) [3]

На практике включения (JOINы) могут сильно замедлить выполнение запроса (особенно в работе с IB, FIB), поэтому рекомендую попробовать следующий способ:
select t1.*,
(select t2.fieldX from table2 t2 where t2.ConnectionField1=t1.ConnectionField1) Psevdonim1,
(select t3.fieldX from table3 t3 where t3.ConnectionField2=t1.ConnectionField2) Psevdonim2
from table1 t1
order by t1.field1, t1.field2,...

Наибольшая скорость выполнеия такого запроса в случае, если просмотр таблиц происходит по индексированным полям.
В случае с JOINами в таблице table1 будут просмотрены все записи от начала до конца, в пордке их физческого положения, несмотря на предложение Order By.


Johnny Smith   (2003-03-20 14:16:00) [4]

2Johnmen © (20.03.03 13:40)
В Оракле нет предикатов (LEFT, RIGHT) JOIN, там другой синтаксис.
WHERE A.id(+)=B.id

Уже есть. В "девятке" появились... Как и CASE"ы.


Johnmen   (2003-03-20 13:40:00) [5]

>galexis © (20.03.03 12:43)
>Пользуюсь книжками по ораклу.

В Оракле нет предикатов (LEFT, RIGHT) JOIN, там другой синтаксис.
WHERE A.id(+)=B.id


galexis   (2003-03-20 13:37:00) [6]

Действительно работает! Огромное спасибо. Вопрос закрыт


zacho   (2003-03-20 13:30:00) [7]


> galexis © (20.03.03 13:27)

Именно так, как ты и написал :-)


galexis   (2003-03-20 13:27:00) [8]

Это понял, спасибо. Но надо еще связать
select
from Tbl1 A
LEFT JOIN Tbl2 B ON B.fld1=A.fld1
LEFT JOIN Tbl3 C ON C.fld1=A.fld1
LEFT JOIN Tbl4 D ON D.fld2=C.fld2

Как здесь D с C связать?


zacho   (2003-03-20 13:06:00) [9]

Не надо запятых.
SELECT ... FROM ...
LEFT JOIN ... ON ...
LEFT JOIN .. ON ..
LEFT JOIN .. ON ..
...


galexis   (2003-03-20 12:59:00) [10]

Почитал я Language Refrence. Почитал, но так и не понял, как связать более 2 таблиц. Для двух все понятно. Ну а для трех как? Писать LEFT JOIN ... ON для каждой связи и разделять запятыми что ли?


Alexandr   (2003-03-20 12:48:00) [11]

стандарт SQL-92


zacho   (2003-03-20 12:47:00) [12]


> galexis © (20.03.03 12:43)

http://www.ibase.ru/ib6.htm#doc
Или ищи какие-нибудь книги по основам SQL. Синтаксис JOIN вроде везде объяснялся, а в Оракле может он и правда специфичный, не знаю


galexis   (2003-03-20 12:43:00) [13]

А где взять этот Language Refrence? Пользуюсь книжками по ораклу. Не могу понять как использовать LEFT JOIN более чем для двух таблиц.


zacho   (2003-03-20 12:37:00) [14]

В завистимости от того, что тебе нужно получить, есть INNER JOIN и LEFT(RIGHT) OUTER JOIN. Подробнее смотри Language Refrence.


Наверх

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