Синтаксис 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
Короче говоря, неоднозначно, следует ли применять фильтрацию к незарезервированной таблице до или после объединения.