Форум: "Базы";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c