Вопрос о разнице между перекрестными соединениями

Возможные дубликаты:
Предложение WHERE лучше выполнять до IN и JOIN или после
INNER JOIN и предложение WHERE: какая разница?

Каковы, если таковые имеются, различия между следующими?

Select 
  col1, 
  col2 
from TableA A, TableB B
where A.ID = B.ID

а также

Select 
  col1, 
  col2
From TableA A
Inner Join TableB B on A.ID = B.ID

Кажется, они ведут себя одинаково в SQL,


person Jim    schedule 03.05.2011    source источник
comment
Обратите внимание, что это не CROSS JOIN. Оба запроса INNER JOINs.   -  person ypercubeᵀᴹ    schedule 04.05.2011


Ответы (4)


Скорее всего, они будут оптимизированы для одного и того же с помощью RDBMS. Они оба JOIN таблицы по A.ID = B.ID критериям.

Однако синтаксис JOIN является явным и считается правильным.

person Matthew    schedule 03.05.2011

Первый — это синтаксис ANSI-89, а второй — синтаксис ANSI-92. Последнее следует использовать почти всегда из-за того, что оно намного понятнее, когда вы начинаете использовать внешние соединения, выраженные в синтаксисе ANSI-92.

person Matt Whitfield    schedule 03.05.2011

Первый синтаксис (как вы указали) представляет собой перекрестное соединение или декартово произведение двух таблиц. В системе без оптимизатора (или с плохим оптимизатором) это создаст комбинацию каждой записи в первой таблице в сочетании с каждой записью во второй таблице, а затем отфильтрует их до тех, которые соответствуют предложению WHERE.

Вывод обоих операторов будет одинаковым, и если используемая вами система имеет хороший оптимизатор, производительность также будет одинаковой.

Два комментария, которые я хотел бы предложить:

1) Я считаю, что при написании заявлений лучше четко указать свои намерения. Если вы намеревались выполнить INNER JOIN, используйте синтаксис INNER JOIN. Будущие вы 6 месяцев форме теперь будете благодарны.

2) Оптимизатор в SQL Server выполнит ВНУТРЕННЕЕ СОЕДИНЕНИЕ в этой ситуации (по крайней мере, последние версии, не может гарантировать все версии), но насколько хорошо он угадывает этот путь, зависит от версии механизма SQL Server и не гарантируется, что он останется прежним в будущем (сомневаюсь, что он изменится в этой ситуации, но действительно ли так высока стоимость ввода еще нескольких символов?)

person Tarwn    schedule 03.05.2011

@ypercube правильно указал, что ваш вопрос касается двух разных синтаксисов INNER JOIN. У вас нет синтаксиса внешнего соединения. Как указал @Matt Whitfield, первый синтаксис - ANSI-92, а второй - стиль ANSI-89. Я полностью согласен с Мэттом в том, что в более сложных запросах синтаксис ANSI-92 намного читабельнее.

Кроме того, в зависимости от вашей версии SQL Server синтаксис ANSI-89 УСТАРЕЛ и может вызвать проблемы. См. SR0010: избегайте использования устаревшего синтаксиса при объединении таблиц. или представлений На самом деле, в следующей версии SQL 2011, или Denali, или как мы ее называем, синтаксис ANSI-89 поддерживаться не будет. См. раздел Функции, не поддерживаемые в следующей версии SQL Server (найдите слово «присоединиться»).

person EBarr    schedule 03.05.2011