:: Visual Foxpro, Foxpro for DOS
Join + Where
H.I.A.
Автор
В некоторых источниках утверждается (если я правильно понимаю), что в Select SQL при присоединении таблиц (join) не следует использовать в where выражения, относящиеся к присоединяемым таблицам, поскольку результаты запроса могут быть неверными.
Сам никогда с такой проблемой не сталкивался.
Объясните, что может произойти? Хочу проянить для себя этот момент, чтобы случайно не наступить на грабли.
Ratings: 0 negative/0 positive
Re: Join + Where
boba

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
В where пишут только условия на таблицы, указанные в предложениии from
Все условия на присоединенные таблицы, указанные в join указывают в on
Отступление от этого правила особенно с keft outer join приводит к неверным результатам




------------------
не имей 100 рублей, а имей сто друзей
Ratings: 0 negative/0 positive
Re: Join + Where
abil

Сообщений: 247
Откуда: Красноярск
Дата регистрации: 01.12.2003
Думаю, что это мягко говоря, не верное утверждение.
Приведите источник и цитату, тогда можно будет ответить конкретней.
Ratings: 0 negative/0 positive
Re: Join + Where
abil

Сообщений: 247
Откуда: Красноярск
Дата регистрации: 01.12.2003
привет, boba - не так.
Условия указанные в фразе ON из JOIN показывают как будут обьеденены таблицы,
a условия указанные в фразе WHERE применяются к уже после, к результату всех обьединений.
Естественно получатся разные, но предсказуемые выборки, но это не зачит, что результат не верен.
В одних задачах нужно налагать ограничения в left outer join ... on ...,
в других в where ...




------------------
Ratings: 0 negative/0 positive
Re: Join + Where
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Смотри здесь некоторые пояснения forum.foxclub.ru и здесь некоторые "бодания" forum.foxclub.ru




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Join + Where
H.I.A.
Автор
Спасибо. Насколько я понимаю, проблема касается left/right outer join:

select a.tid, a.tname,b.something from a left outer join b on a.tid=b.tid where b.something>10

т.е. получаем фактически inner join, поскольку для отсутствующей записи в таблице b условие b.something>10 будет некорректным.

А если добавить nvl(), то запрос будет корректным ?

select a.tid, a.tname,b.something from a left outer join b on a.tid=b.tid where nvl(b.something,11)>10

Я понимаю, что в данном конкретном случае прощего всего перенести условие в on, но на практике, когда присоединяется десяток таблиц и между ними выстраиваются порой достаточно хитрые условия, все перенести в on не предоставляется возможным...
Ratings: 0 negative/0 positive
Re: Join + Where
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi H.I.A.!

Правильно понимаешь. Хотел написать практически дословно как abil, но потом подумал, что зерно истины в совете НЕ использовать такие условия в WHERE есть - всё-же это обычно не совсем понятно, и способствует написанию "некорректных" запросов. Хотя если понимать что и как работает, то вполне можно использовать.




------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 10 NSF  (Гостей: 9)

© 2000-2024 Fox Club 
Яндекс.Метрика