Внутреннее соединение
Внутреннее соединение
Следующий оператор соединяет две таблицы, которые связаны через внешний ключ FK правой таблицы (Table2) и первичный ключ PK таблицы Table1:
SELECT
Таblе1.PK,
Table1.COL1,
Table2.PKX,
Table2.COLX
FROM Table1 INNER JOIN Table2
ON Table1.PK = Table2.FK
WHERE... условия-поиска
Это спецификация внутреннего соединения. Вскоре мы рассмотрим внешнее соединение. На рис. 22.1 показаны два потока, как они существуют в таблицах, и генерируемый набор данных.
Рис. 22.1. Внутреннее соединение
Как показывает диаграмма, внутреннее соединение объединяет два потока таким образом, что несоответствующие строки в любом из потоков отбрасываются. Другое название внутреннего соединения - исключающее соединение, поскольку его правила означают, что несоответствующие пары обоих потоков исключаются из выходного набора данных.
Стандарты SQL описывают два варианта синтаксиса внутреннего соединения. Предыдущий пример использует более современный синтаксис SQL-92, отличающийся от более старого, более ограниченного SQL-89, указывая явное соединение, потому что в примере используется явное предложение JOIN для задания условий соединения.
Синтаксис неявного INNER JOIN в SQL-89
В стандарте SQL-89 таблицы, участвующие в соединении, задаются списком с разделяющими запятыми в предложении FROM запроса SELECT. Условия для связи таблиц задаются среди условий поиска предложения WHERE. Не существует специального синтаксиса для указания, какие условия используются для поиска, а какие - для соединения. Предполагается, что условия соединения самоочевидны. Обратившись назад, к введению в предложение JOIN, можно назвать старый синтаксис неявным соединением.
Синтаксис неявного соединения может осуществлять только внутреннее соединение - реализация SQL, которая не поддерживает предложение JOIN, не может выполнять внешнее соединение.
Вот предыдущий пример, который переписан как неявное соединение:
SELECT
Table1.PK,
Table1.COL1,
Table2.PKX,
Table2.COLX
FROM Table1, Table2
WHERE Table1.PK = Table2.FK
AND <условия-поиска>
Неявное соединение поддерживается в Firebird для совместимости с кодом существующих приложений. Оно не рекомендуется для новых приложений, потому что оно несовместимо с синтаксисом других видов соединений и делает поддержку и само- документируемость довольно неуклюжей. Некоторые программы доступа к данным, включая драйверы, могут не обрабатывать правильно синтаксис SQL-89 по причине проблем при синтаксическом анализе в различении условий соединения и условий поиска. Можно предположить, что в будущем стандарте этот синтаксис будет отсутствовать.