Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 sql разница join и where объединений. Join 3-х таблиц  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
1) Поделитесь пожалуйста опытом, в чем разница в объединении таблиц
способами join и where?
2) Хочу разобраться с join 3-x и более таблиц, ниже приведенные запросы аналогичны?
Результат выдают одинаковый, нет ли тонкостей?
select t1.t1_ID, t2.t2_ID, t3.t3_ID 
from t1
    ,t2
    ,t3
where t1.foreign_t2_ID = t2.t2_ID
  and t2.foreign_t3_ID = t3.t3_ID

select t1.t1_ID, t2.t2_ID, t3.t3_ID  
from t1 inner join t2 on t1.foreign_t2_ID = t2.t2_ID
        inner join t3 on t2.foreign_t3_ID = t3.t3_ID
14 май 12, 13:08    [12549483]     Ответить | Цитировать Сообщить модератору
 Re: sql разница join и where объединений. Join 3-х таблиц  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
посмотри планы выполнения и сравни.
14 май 12, 13:14    [12549543]     Ответить | Цитировать Сообщить модератору
 Re: sql разница join и where объединений. Join 3-х таблиц  [new]
Добрый Э - Эх
Guest
соединение через WHERE - устаревший синтаксис. Внешние (левое / правое) соединения в этом случае - через (*), полное соединение делается через объединение левого и правого соединений
соединение через JOIN - ANSI-фича. Внешние соединения делается через ключевые слова LEFT / RIGHT / FULL

По результату - эквиваленты, если не запутаешься в роли предикатов при ANSI-синтаксисе
14 май 12, 13:20    [12549609]     Ответить | Цитировать Сообщить модератору
 Re: sql разница join и where объединений. Join 3-х таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
is_me,

запятая - это практически CROSS JOIN
14 май 12, 13:56    [12549974]     Ответить | Цитировать Сообщить модератору
 Re: sql разница join и where объединений. Join 3-х таблиц  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
Добрый Э - Эх
соединение через WHERE - устаревший синтаксис. Внешние (левое / правое) соединения в этом случае - через (*), полное соединение делается через объединение левого и правого соединений
соединение через JOIN - ANSI-фича. Внешние соединения делается через ключевые слова LEFT / RIGHT / FULL

По результату - эквиваленты, если не запутаешься в роли предикатов при ANSI-синтаксисе


"если не запутаешься в роли предикатов при ANSI-синтаксисе" - это в случае с join объединениями? Тогда может быть при объединении 3 - х и более таблиц использовать where?
14 май 12, 14:06    [12550063]     Ответить | Цитировать Сообщить модератору
 Re: sql разница join и where объединений. Join 3-х таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
is_me,

Проще и правильнее вообще забыть о существовании синтаксиса перечисления таблиц через запятую.
14 май 12, 14:13    [12550114]     Ответить | Цитировать Сообщить модератору
 Re: sql разница join и where объединений. Join 3-х таблиц  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
invm
is_me,

Проще и правильнее вообще забыть о существовании синтаксиса перечисления таблиц через запятую.


invm, я поэтому и задал этот неоднократно повторяющийся вопрос в форуме, т.к. почти нигде не описано ПОЧЕМУ! Почему лучше забыть о существовании синтаксиса перечисления таблиц через запятую, скажите пожалуйста? Это культура синтаксиса запроса или техническая подоплека? Или еще что - то?
14 май 12, 14:19    [12550166]     Ответить | Цитировать Сообщить модератору
 Re: sql разница join и where объединений. Join 3-х таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
is_me,

Вам недостаточно того, что такой синтаксис объявлен устаревшим?
Вот вам еще причина: Начиная с SQL Server 2008, использование операторов внешнего соединения *= или =*, не соответствующих стандарту ANSI, запрещено для БД с уровнем совместимости выше 80.
14 май 12, 14:50    [12550473]     Ответить | Цитировать Сообщить модератору
 Re: sql разница join и where объединений. Join 3-х таблиц  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
is_me
invm
is_me,

Проще и правильнее вообще забыть о существовании синтаксиса перечисления таблиц через запятую.


invm, я поэтому и задал этот неоднократно повторяющийся вопрос в форуме, т.к. почти нигде не описано ПОЧЕМУ! Почему лучше забыть о существовании синтаксиса перечисления таблиц через запятую, скажите пожалуйста? Это культура синтаксиса запроса или техническая подоплека? Или еще что - то?


Вообще тема обсосана до косточек, тебе только надо поискать.

ANSI OUTER JOIN vs TSQL OUTER JOIN.

За ANSI JOIN есть стилистические доводы:

-- запрос лучше читается, есть для каждой таблицы отдельно прописанное условие JOIN-а.
-- WHERE становится понятней -- сразу видны критерии ПОИСКА, потому что критерии JOIN-а ушли.
-- легче менять запрос, легче читать -- почти всё упоминание таблицы в одном месте. JOIN если что легче закомментировать.

(за WHERE при желании можно найти тоже свои доводы).

Кроме этого есть и семантические доводы (которые уже не субъективны):

Запрос :

select *
from A a, B b
where a.k1 *= b.k1 and b.f1 = 25 and b.f2 is null

Тут применяется внешнее соединение A и B, таблица A -- внешняя. Для таблицы B при отсутствии соотв. записи генерируется запись со всеми полями NULL.
Вопрос: b.f1, b.f2 -- какое значение поля имеется в виду ? До JOIN-a или после ? Они разные.

В записи
select *
from A a
left join B b on a.k1 = b.k1 and b.f1 = 25
where b.f2 is null

всё ясно : b.f1 -- поле ДО jOIN-а, b.f2 --поле ПОСЛЕ jOIN-а.

Именно поэтому для внешних соединений использование ANSI -синтаксиса просто необходимо.
Для обычных соединений можно использовать и старый синтаксис, но новый просто стандартный и удобный.
14 май 12, 14:55    [12550531]     Ответить | Цитировать Сообщить модератору
 Re: sql разница join и where объединений. Join 3-х таблиц  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
Всем большое спасибо, начинает проясняться.
14 май 12, 15:43    [12550955]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить