Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как будет правильно заджойнить и почему ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Привет.

Подскажите пожалуйста какой запрос будет более правильным и почему.


select 1
from Tab1 t1
join Tab2 t2 on t1.T2_id = t2.id  and t2.id > 3000


select 1
from Tab1 t1
join Tab2 t2 on t1.T2_id = t2.id

where t2.id > 3000


Различие в том, что фильтр к t2 применяется либо в условии джоина, либо в Where.
11 сен 15, 16:09    [18138809]     Ответить | Цитировать Сообщить модератору
 Re: Как будет правильно заджойнить и почему ?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
особой разницы нет именно в данном случае. во всяком случае до соединения с таблицей tab1 оптимизатор должен отфильтровать tab2 > 3000.
11 сен 15, 16:13    [18138833]     Ответить | Цитировать Сообщить модератору
 Re: Как будет правильно заджойнить и почему ?  [new]
Гадя Петрович
Member

Откуда: планета Плюк, 215 в тентуре, галактика Кин-дза-дза в Спирали
Сообщений: 52912
привычка пихать фильтрацию в условия соединения может сыграть с вами злую шутку в случае, если эти соединения будут внешними
11 сен 15, 16:16    [18138853]     Ответить | Цитировать Сообщить модератору
 Re: Как будет правильно заджойнить и почему ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
ok. Т.е. правильней в джоины записывать только исключительно условия соединения, а в Where - любую фильтрацию ?

В принципе я так и предполагал.
Думаю движок базы сначала применит различные ограничивающие фильтры в условиях Where, а потом то, что осталось будет джойнить.
11 сен 15, 16:26    [18138942]     Ответить | Цитировать Сообщить модератору
 Re: Как будет правильно заджойнить и почему ?  [new]
хе-хе )
Guest
ProBiotek,
Не правильно думаете. Условие в соединение и в where оцениваются как одно
11 сен 15, 16:35    [18139009]     Ответить | Цитировать Сообщить модератору
 Re: Как будет правильно заджойнить и почему ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
хе-хе ),

Тогда разницы нет куда фильтр пихать ?

Для каждой строки таблицы вычисляется фильтрация один раз - но сразу все, что ее касается ?
11 сен 15, 16:43    [18139069]     Ответить | Цитировать Сообщить модератору
 Re: Как будет правильно заджойнить и почему ?  [new]
хе-хе )
Guest
автор
Тогда разницы нет куда фильтр пихать ?

Для внутреннего соединения нет. Для внешнего есть, это логично
Я часто пихаю в join. т.к логически получаю именованный набор
11 сен 15, 16:51    [18139110]     Ответить | Цитировать Сообщить модератору
 Re: Как будет правильно заджойнить и почему ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
хе-хе )
т.к логически получаю именованный набор


это следует читать как "все что связано, находится рядом" ? или я не правильно понял эту часть фразы ?
11 сен 15, 16:54    [18139123]     Ответить | Цитировать Сообщить модератору
 Re: Как будет правильно заджойнить и почему ?  [new]
в том, что фи
Guest
ProBiotek,

в данном конкретном случае разница только стилистическая

как лучше - смотря какая семантика этих фильтров
если по смыслу этой 3000 возможен фильтр left join и в условии соединения > 3000, то это доп.условие соединения
если нет, то это просто фильтрация соединенного и место ему в where
11 сен 15, 23:29    [18140858]     Ответить | Цитировать Сообщить модератору
 Re: Как будет правильно заджойнить и почему ?  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Схемы таблиц незабывайте писать
12 сен 15, 12:29    [18141725]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить