Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Alexander Popov Member Откуда: Сообщений: 663 |
Доброго времени суток ALL. Помогите разобраться. Запрос вида
и запрос вида
Выдадут один и тот же результат объясните мне зачем тогда нужен inner join? Тем более "читабельность" запроса c inner join при усложнении самого запроса тоже усложняется. |
||||
26 май 04, 13:01 [701722] Ответить | Цитировать Сообщить модератору |
Вербняков Александр Member Откуда: г.Таганрог, Ростовская область Сообщений: 498 |
Разные версии языка, первая конструкция в более ранних реализациях SQL последняя в более поздних |
26 май 04, 13:04 [701739] Ответить | Цитировать Сообщить модератору |
pkarklin Member Откуда: Москва (Муром) Сообщений: 74925 |
Спорное утверждение... |
||||||
26 май 04, 13:05 [701746] Ответить | Цитировать Сообщить модератору |
Alexander Popov Member Откуда: Сообщений: 663 |
Так вот и хочется понять зачем было городить огород если можно и без inner join работать |
26 май 04, 13:05 [701752] Ответить | Цитировать Сообщить модератору |
Alexander Popov Member Откуда: Сообщений: 663 |
2 pkarklin Возможно спорное если применять Left join или Right Join. |
26 май 04, 13:09 [701775] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31776 |
Мне кажется, с inner Join понятнее, особенно если у вас десяток таблиц джойница. Аккуратный списочек.
|
||
26 май 04, 13:10 [701779] Ответить | Цитировать Сообщить модератору |
paparome Member Откуда: Москва Сообщений: 4312 |
А вы попробуйте штук 10 таблиц поджойнить (да если еще и по нескольким полям джойн идет), а потом все уcловия перетащить во where и заменить inner join на запятые И посмотрите на читабельность where |
26 май 04, 13:13 [701803] Ответить | Цитировать Сообщить модератору |
Alexander Popov Member Откуда: Сообщений: 663 |
Список тоже вполне аккуратный |
||
26 май 04, 13:13 [701806] Ответить | Цитировать Сообщить модератору |
pkarklin Member Откуда: Москва (Муром) Сообщений: 74925 |
Ну, почему же!? С помощью JOIN указываем как объединять таблицы, а в WHERE как фильтровать. Все красиво. |
||||||
26 май 04, 13:14 [701810] Ответить | Цитировать Сообщить модератору |
С.Лютый
Guest |
ну так в чем проблема? это же замечательно, когда есть выбор. Используйте любимый (удобный) вариант и все |
26 май 04, 13:15 [701818] Ответить | Цитировать Сообщить модератору |
Вербняков Александр Member Откуда: г.Таганрог, Ростовская область Сообщений: 498 |
Кстатит построитель запросов пользуется именно join , это наверное очень весомый аргумент, потому что небольшие запросы можно быстро на нём ваять или строить большие join, а потом накладывать case условия ... и я согласен что намного удобнее когда в WHERE только условия отбора но не объединения |
26 май 04, 13:16 [701821] Ответить | Цитировать Сообщить модератору |
Alexander Popov Member Откуда: Сообщений: 663 |
Обычно двух абсолютно одинаково оптимальных решений не бывает всегда чем то лучше одно чем то другое целью топика было выяснить плюсы и минусы. |
26 май 04, 13:18 [701830] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37117 |
Вообще-то join'ы - это ANSI стандарт. |
||||||
26 май 04, 13:21 [701853] Ответить | Цитировать Сообщить модератору |
Alexander Popov Member Откуда: Сообщений: 663 |
А что разве условие where не ANSI стандарт? |
26 май 04, 13:23 [701858] Ответить | Цитировать Сообщить модератору |
GreenSunrise Member Откуда: Сообщений: 12310 |
Позвольте не согласиться. Фильтры для данных пишутся в части WHERE. Это два разных понятия, разумно разнесенные в разные части запроса. Это как раз повышает читабельность. ------------------------------- А вообще - пока звездочки не отменили, пишите, пишите... Никто же вам не запрещает. |
||||||
26 май 04, 13:25 [701868] Ответить | Цитировать Сообщить модератору |
Alexander Popov Member Откуда: Сообщений: 663 |
Спасибо всем большое. Было очень интересно выслушать ваши мнения. Лично для меня точки над i расставлены. |
26 май 04, 13:28 [701885] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37117 |
И будьте готовы все переписать, когда отменят. ![]() |
||||||
26 май 04, 13:28 [701886] Ответить | Цитировать Сообщить модератору |
SandalTree Member Откуда: Перехлёсток восьми батог Сообщений: 28146 |
Вот по ходу дела столкнулся с невозможностью (или с моим непониманием) построить запрос на JOIN.
Вот такой код работает (правда ругается):
Тот-же код но с Join нет:
Или я чего не понимаю? |
||||||
28 май 04, 00:04 [706470] Ответить | Цитировать Сообщить модератору |
ChA Member Откуда: Москва Сообщений: 11201 |
Где-то в недрах BOL описано раздичие между использованием "*" и OUTER JOIN-ов В запросе
условие fl = 0, где fl есть #t.fl, превращает запрос в INNER JOIN. Не уверен, что автор именно этого и добивался :) |
||||||
28 май 04, 02:59 [706567] Ответить | Цитировать Сообщить модератору |
gvorl Member Откуда: Сообщений: 1 |
А вот так:
|
||
28 май 04, 06:59 [706616] Ответить | Цитировать Сообщить модератору |
GreenSunrise Member Откуда: Сообщений: 12310 |
Для понимания разницы в результатах надо посмотреть на планы выполнения. Давайте рассмотрим запрос, убрав из него группировку, чтобы увидеть, какие строки вообще возвращаются в первом и втором варианте. Первый вариант (*=)
Второй вариант (left join)
Теперь рассмотрим планы выполнения запросов: Первый:
Второй:
В первом случае сначала была выборка из таблицы #t с условием [#t].[fl]=0), потом выборка таблицы #u с условием [#u].[rid]=3, потом Left Outer Join между ними. Потому "Оля" и попала в конечный результат. Во втором сравнение #u.rid и #t.uid происходило в Merge Join операторе, причем выбран Inner Join, как показано в плане выполнения. Потому и ни одной строки в конечный результат не попало. Разница в результатах получается потому, что использование старого и нового синтаксиса меняет способ их получения. В первом случае выборка - обе таблицы, никак не связанные, на которые позже наложены дополнительные условия. Во втором - сначала делается связывание таблиц по условию, потом делается выборка из получившегося результата. Посмотрим на выборку без фильтрации:
То есть сам по себе left join работает ОДИНАКОВО СО СТАРЫМ И НОВЫМ СИНТАКСИСОМ. Дальнейшие же действия зависят от того, что ВЫ понимаете под правильной фильтрацией #t.fl = 0 and #u.rid = 3. Если выборку из вышеприведенного результата по данному условию (вернется ноль строк), то ставим #t.fl = 0 and #u.rid = 3 во WHERE. Если джойн и фильтрацию вы хотите совместить, то вносите дополнительное условие в JOIN, как вам и предложил gvorl:
Посмотрите на эти два запроса и их результаты:
Отсюда и разница в поведении. Прошу прощения, что объяснение такое многословное, но без примеров было не обойтись. |
||||||||||||||||
28 май 04, 14:44 [708145] Ответить | Цитировать Сообщить модератору |
SandalTree Member Откуда: Перехлёсток восьми батог Сообщений: 28146 |
2 gvorl & GreenSunrise Огромное спасибо. |
28 май 04, 17:49 [708841] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |