Для SQL, когда стало желательно всегда использовать слова «Внутреннее соединение» вместо неявного объединения? - PullRequest
5 голосов
/ 25 апреля 2010

Для SQL, когда стало желательным всегда использовать слова «Внутреннее соединение» вместо неявного соединения:

select * from t1, t2 where t1.ID = t2.ID;

? Это просто для стиля или для разграничения внешнего соединения или есть другие причины для этого?

Ответы [ 5 ]

3 голосов
/ 25 апреля 2010

Синтаксис INNER и OUTER JOIN был формализован в спецификации SQL-92. Во многих продуктах баз данных, таких как MySQL и SQL Server, вы можете опустить слово «INNER» во внутренних соединениях и просто использовать «JOIN». Точно так же многие продукты баз данных позволяют опустить слово «OUTER» и просто использовать «LEFT JOIN» или «RIGHT JOIN» для внешних объединений. Старый синтаксис внешнего соединения *= или =* создавал неоднозначности во многих обстоятельствах. Многие продукты имеют или очень скоро перестанут поддерживать старый синтаксис внешнего объединения.

До спецификации SQL-92 каждый из поставщиков использовал свой собственный синтаксис, обозначающий внешнее соединение. То есть *= не было универсальным (кажется, я помню кого-то, кто использовал ?=). Кроме того, они не реализовали внешнее соединение универсальным способом. Возьмите следующий пример:

Table1
Col1    Col2
1       Alice
2       Bob

Table2
Col1    Col2
1           1
2           2
3           3
4           4

Select 
From Table1, Table2
Where Table2.Col1 *= Table1.Col1

Приведенный выше запрос обычно дает:

1   1   1       Alice
2   2   2       Bob
3   3   Null    Null
4   4   Null    Null

Теперь попробуйте:

Select 
From Table1, Table2
Where Table2.Col1 *= Table1.Col1
    And Table2.Name = 'Alice'

В некоторых продуктах базы данных вы получите:

1   1   1       Alice

На других вы получите:

1   1   1       Alice
2   2   Null    Null
3   3   Null    Null
4   4   Null    Null

Короче говоря, неоднозначно, следует ли применять фильтрацию к незарезервированной таблице до или после объединения.

2 голосов
/ 25 апреля 2010

Стало желательным, когда был добавлен новый синтаксис для обработки несоответствий с реализациями внешнего соединения.

Поскольку объединение внешних и внутренних объединений (и конкретных внешних объединений в обоих направлениях) со старым синтаксисом во многих случаях неоднозначно, необходимо было создать и реализовать новый синтаксис, чтобы программист мог на 100% четко понимать порядок и группировку из пунктов объединения.

Тем не менее, все еще совершенно законно писать внутренние соединения старого стиля сами по себе, но внешние соединения старого стиля исчезают во всех формах, и это хорошее избавление.

0 голосов
/ 25 апреля 2010

ANSI-92 стандартное ммм, это сложный вопрос, я собираюсь выйти на конечность и угадать 1992

0 голосов
/ 25 апреля 2010

Я считаю, что это стандарт ANSI. Он должен возвращать ошибку, когда ключевое слово ON опущено, а (IMO) - более декларативный стиль.

0 голосов
/ 25 апреля 2010

Стало желательным, когда это стало возможным ...

Ключевое слово join лучше описывает намерение "классического" объединения.Кроме того, если в запросе много объединений, таблица для объединения и условие для использования отображаются рядом друг с другом вместо того, чтобы все таблицы находились в одном месте, а все условия в другом.

...