Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.10;
Скачать: CL | DM;

Вниз

SELECT из большого числа таблиц   Найти похожие ветки 

 
galexis ©   (2003-03-20 12:33) [0]

Уважаемые мастера! Подскажите как правильно составить 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-20 12:37) [1]

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


 
galexis ©   (2003-03-20 12:43) [2]

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


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


> galexis © (20.03.03 12:43)

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


 
Alexandr ©   (2003-03-20 12:48) [4]

стандарт SQL-92


 
galexis ©   (2003-03-20 12:59) [5]

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


 
zacho ©   (2003-03-20 13:06) [6]

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


 
galexis ©   (2003-03-20 13:27) [7]

Это понял, спасибо. Но надо еще связать
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:30) [8]


> galexis © (20.03.03 13:27)

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


 
galexis ©   (2003-03-20 13:37) [9]

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


 
Johnmen ©   (2003-03-20 13:40) [10]

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

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


 
Johnny Smith ©   (2003-03-20 14:16) [11]

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

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



 
eugie ©   (2003-03-21 07:36) [12]

На практике включения (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.


 
Johnmen ©   (2003-03-21 09:34) [13]

>eugie © (21.03.03 07:36)

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


 
zacho ©   (2003-03-21 10:17) [14]


> Johnmen © (21.03.03 09:34)

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



Страницы: 1 вся ветка

Текущий архив: 2003.04.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
7-30634
Ruf
2003-02-14 11:18
2003.04.10
hotkey


6-30489
AGAMEMNUM
2003-02-18 08:39
2003.04.10
Как сохранить HTML?


9-30208
Sword-Fish
2002-11-10 01:22
2003.04.10
Упаковка ресурсов


14-30591
nayk
2003-02-18 02:53
2003.04.10
Подскажите где найти инфу по SMS


3-30281
SaperXL
2003-03-20 00:40
2003.04.10
Помогите выбрать СУБД