Join + Where | |
---|---|
H.I.A. Автор |
В некоторых источниках утверждается (если я правильно понимаю), что в Select SQL при присоединении таблиц (join) не следует использовать в where выражения, относящиеся к присоединяемым таблицам, поскольку результаты запроса могут быть неверными.
Сам никогда с такой проблемой не сталкивался. Объясните, что может произойти? Хочу проянить для себя этот момент, чтобы случайно не наступить на грабли. |
Re: Join + Where | |
---|---|
boba Сообщений: 6269 Откуда: Медвежьи озера- Дата регистрации: 26.03.2001 |
В where пишут только условия на таблицы, указанные в предложениии from
Все условия на присоединенные таблицы, указанные в join указывают в on Отступление от этого правила особенно с keft outer join приводит к неверным результатам ------------------ не имей 100 рублей, а имей сто друзей |
Re: Join + Where | |
---|---|
abil Сообщений: 247 Откуда: Красноярск Дата регистрации: 01.12.2003 |
Думаю, что это мягко говоря, не верное утверждение.
Приведите источник и цитату, тогда можно будет ответить конкретней. |
Re: Join + Where | |
---|---|
abil Сообщений: 247 Откуда: Красноярск Дата регистрации: 01.12.2003 |
привет, boba - не так.
Условия указанные в фразе ON из JOIN показывают как будут обьеденены таблицы, a условия указанные в фразе WHERE применяются к уже после, к результату всех обьединений. Естественно получатся разные, но предсказуемые выборки, но это не зачит, что результат не верен. В одних задачах нужно налагать ограничения в left outer join ... on ..., в других в where ... ------------------ |
Re: Join + Where | |
---|---|
PaulWist Сообщений: 14601 Дата регистрации: 01.04.2004 |
Смотри здесь некоторые пояснения forum.foxclub.ru и здесь некоторые "бодания" forum.foxclub.ru
------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
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 не предоставляется возможным... |
Re: Join + Where | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Hi H.I.A.!
Правильно понимаешь. Хотел написать практически дословно как abil, но потом подумал, что зерно истины в совете НЕ использовать такие условия в WHERE есть - всё-же это обычно не совсем понятно, и способствует написанию "некорректных" запросов. Хотя если понимать что и как работает, то вполне можно использовать. ------------------ WBR, Igor |
© 2000-2024 Fox Club  |