Страница 1 из 1
Джоины
Добавлено: 28 окт 2004, 12:43
Gelios
в запросе вида
Код: Выделить всё
select
from table t1 left jion table t2 on ....
where t1.field in (2,5)
and t2.field in (1,4)
что сначала будет выполнятся: джоин или отбор нужных записей?
Добавлено: 28 окт 2004, 14:08
dimitr
Отбор в t1, потом для каждой записи результата отбор в t2, потом джойн результатов.
Добавлено: 28 окт 2004, 14:37
Gelios
хм, а вот результат получается, как если бы сначала был джойн, потом отбор записей, то есть неверный...
Добавлено: 28 окт 2004, 15:07
kdv
в каком смысле "неверный"? ты join с left join не перепутал?
убери условие where для таблицы t1 - получишь ее целиком (left join).
Добавлено: 28 окт 2004, 15:25
dimitr
Gelios писал(а):хм, а вот результат получается, как если бы сначала был джойн, потом отбор записей, то есть неверный...
Условие для t2 (которое в where) проверяется после джойна. Иначе outer join не выполнить.
Добавлено: 29 окт 2004, 05:05
Gelios
ага, но тогда часть записей в результирующем наборе для t2 будут иметь null и я переписываю условие так and (t2.field in (1, 4) or t2.filed is null) думая получить при этом left join, однако все равно получаю только join.
а вот если сам join перепишу так
select *
table t1 left join table t2 on t1.f=t2.f and t2.field in (1,4)
where t1.field in (2,5)
то получу имеено left join
Добавлено: 29 окт 2004, 09:22
dimitr
Ты определись, что тебе надо. Все, что находится в ON, определяет поведение внешнего джойна, т.е. когда будет возвращено значение, а когда - NULL. Выборку это не усекает. Все, что находится в WHERE, усекает выборку. Для внешней таблицы джойна фильтр будет применен до соединения, для внутренней - после.
ЗЫ. В 1.5.х есть баг на эту тему, исправлено в 1.5.2.
Добавлено: 29 окт 2004, 10:22
Gelios
из одной таблицы формируется два набора данных t1 и t2. условия формирования t1.field in (2,5) и t2.field in (1,4) соответсвенно. в наборе t2 записей не больше чем в t1.
если сначала идет отбор записей (скажем t1 10 записей. а t2 8 записей) а потом джойн, то результат должен содержать 10 записей (если я правильно понял), а не 8 как сейчас возвращается.
если же сначала идет джойн а потом отбор записей, то условие t2.field in (1,4) or t2.field is null все равно не помогает...
можно наверное было создать вьюшку для набора t2, но не хочется создавать лишний объект для такого элементарного запросика