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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.032 c
2-1152764056
Rubey
2006-07-13 08:14
2006.07.30
Sirus


2-1152513739
Darkwing
2006-07-10 10:42
2006.07.30
Delphi не открывает проект


15-1151556036
Ega23
2006-06-29 08:40
2006.07.30
С Днём рождения! 29 июня


1-1150875962
hbreaker
2006-06-21 11:46
2006.07.30
перечисления..


1-1150257710
xex32
2006-06-14 08:01
2006.07.30
Как принять штрих код со сканера Eclipse в компонент TEdit