Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Вниз

SQL запрос на выборку из трёх таблиц   Найти похожие ветки 

 
PP   (2006-07-10 19:55) [0]

Добрый день.
Такой вопрос. ЕСТЬ БД. необходимо Написать запрос, выбирающий данные из разных таблиц, при том что для всех строк одной таблицы присоединялись значения других по определённому критерию.
Для соединения первой и второй таблицы делаю запрос следующего типа:
Select  tab1.f1,tab1.f2,tab1.f3,tab2.f2
from table1 tab1 left join table2 tab2 on ((tab1.f1=tab2.f1) and (tab2.f3=100) )

в таком виде всё работает. необходимо  прсоеденить к первой таблице третью (также как и вторую).
Подскажите пожалуйста как это лучше сделать, а то все мои попытки не увенчались успехом......


 
Johnmen ©   (2006-07-10 22:10) [1]

Синтаксис внешнего соединения зависит от типа БД.
Напр. такой
SELECT ... FROM ...
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...


 
Desdechado ©   (2006-07-11 11:11) [2]

кусок (tab2.f3=100) ) я бы вынес в секцию WHERE


 
zdm   (2006-07-11 11:45) [3]

SELECT t1.*
FROM (t1 INNER JOIN t2 ON t1.id = t2.n2) INNER JOIN t3 ON t2.id = t3.n3;


 
PP   (2006-07-11 12:44) [4]

Спасибо всем за помощь.
Desdechado, данный кусок в секцию WHERE не вынесешь, так как необходима выборка записей и с пустым значением tab2.f3.
Johnmen, zdm. Только что набросал простенькую БД, и всё работает по вашим советам, но почему-то делая тоже самое с исходной БД (к сожалению проверить на ней смогу только завтра) результат был не совсем правильный.
В любом случае спасибо. Завтра ещё попытаюсь и результат сообщу.


 
Desdechado ©   (2006-07-11 12:54) [5]

имхо, как-то не вяжется (tab2.f3=100) и "с пустым значением tab2.f3"


 
PP   (2006-07-11 13:29) [6]

Desdechado, смотри. Мне надо, чтобы строка отображалась в любом случае, даже если в поле f3 таблицы tab2 и нет значений равных 100. В этом случае в результате запроса на месте tab2.f2  будет пустое значение.
Поютому я и пишу on ((tab1.f1=tab2.f1) and (tab2.f3=100) ).
Если же я напишу это условие в Where то строка не отобразится совсем.


 
Desdechado ©   (2006-07-11 13:34) [7]

ты со своими F1, F2 и F3 совсем запутался


 
PP   (2006-07-11 14:17) [8]

Я не запутался, но не в этом суть.  Соединяя таким образом 2 таблицы всё ОК. Сложность возникла в соединении большего числа таблиц, чтобы одна была главной, а остальные соединялись с ней с помощью Left join /
Завтра ещё попробую. а там видно будет...


 
PP   (2006-07-12 23:13) [9]

В общем ещё раз попробовал. Использовал синтаксис
SELECT ... FROM ...
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...

Работает но ооооооочень медленно. Если оставить один LEFT, а остольные сделать INNER, тогда работает быстро. Но данная ситуация меня не устраивает, так как могут выбираться не все записи.
Странна такая задержка по времени, ведь при любом раскладе максимальное кол-во отобранных записей не превышает 120.
В чём может быть дело?


 
evvcom ©   (2006-07-13 08:56) [10]

> [2] Desdechado ©   (11.07.06 11:11)

Это не одно и то же для OUTER JOIN

> [3] zdm   (11.07.06 11:45)

Разницу между INNER и LEFT JOIN понимаешь?

> [8] PP   (11.07.06 14:17)
> Сложность возникла в соединении большего числа таблиц,

В чем сложность-то? В [9]?

> [9] PP   (12.07.06 23:13)

Это уже вопрос оптимизации. Тут можно помочь только зная, что за сервер СУБД используешь, конкретный запрос, DDL таблиц, индексов. Представлять сколько записей в каждой из таблиц. Сбор статистики. В тяжелых случаях не обойтись без плана запроса и, возможно, более мощных средств оптимизации.


 
novill ©   (2006-07-13 09:26) [11]


> PP   (12.07.06 23:13) [9]

индексы по полям по которым соединяешь - в 90% случаев помогает.


 
evvcom ©   (2006-07-13 12:29) [12]

> [11] novill ©   (13.07.06 09:26)
> индексы по полям по которым соединяешь - в 90% случаев помогает.

Ты заявляешь это без ссылки на СУБД? В Оракле, например, этот процент хорошо, если достигнет уровня 2-3%. Я говорю про случай, когда построены индексы только по соединяемым полям, причем в индексе 1 поле, и более-менее о реальных, а не надуманных запросах.



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

Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.011 c
15-1151559934
vajo
2006-06-29 09:45
2006.07.30
Почему-то вырубается компьютер


15-1151931225
Mozart
2006-07-03 16:53
2006.07.30
Как насчет DVD с бд форумов?


6-1142861596
RomanH
2006-03-20 16:33
2006.07.30
Параметры SocketConnection во время выполнения программы


15-1151344759
Nic
2006-06-26 21:59
2006.07.30
Основные принципы прокладки кабеля Ethernet


4-1145000154
Keks
2006-04-14 11:35
2006.07.30
Очередь печати принтера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский