Форум: "Начинающим";
Текущий архив: 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.01 c