Читаем Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ полностью

В стандарте 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 по причине проблем при синтаксическом анализе в различении условий соединения и условий поиска. Можно предположить, что в будущем стандарте этот синтаксис будет отсутствовать.

<p>Синтаксис явного INNER JOIN в SQL-92</p>

Явное внутреннее соединение является предпочтительным для Firebird и других реляционных СУБД, которые его поддерживают. Если оптимизатор способен вычислить план запроса, то неважно, что синтаксис SQL-92 будет лучше или хуже более раннего синтаксиса, потому что интерпретатор DSQL будет транслировать любой оператор в идентичную двоичную форму для анализа ее оптимизатором.

Явное соединение делает код оператора более читаемым и согласованным с другими стилями соединения, поддерживаемыми SQL-92 и последующими стандартами. Иногда его синтаксис называют синтаксисом условного соединения, потому что структура предложения JOIN. .. ON дает возможность отличать условия соединения от условий поиска. Не удивительно, такое использование термина "условное" может все запутать!

Ключевое слово INNER совсем необязательно и обычно опускается. Присутствие только слова JOIN имеет точно тот же смысл, что и INNER JOIN. (Если слову JOIN предшествуют LEFT, RIGHT или FULL, то это не является внутренним соединением.)

Три или более потока

Если существует более двух потоков (таблиц), просто добавляйте предложения JOIN. .. ON для каждого отношения. Следующий пример добавляет третий поток в предыдущий пример, соединяя его со вторым потоком через другой внешний ключ отношения:

SELECT

Table1.PK,

Table1.COL1,

Table2.PK,

Table2.COLX,

Table3.COLY

FROM Table1 JOIN Table2

ON Table1.PK = Table2.FK

JOIN Table3 ON TABLE2.PKX = Table3.FK

WHERE Table3.STATUS = 'SOLD'

AND <другие-условия-поиска>

Связи составных ключей

Если одно отношение связано более чем с одним столбцом, используйте ключевое слово AND для разделения каждого условия соединения, как вы делаете в предложении WHERE для множества условий. Возьмем, для примера, таблицу TableA с первичным ключом (PKI, РК2), связанную с таблицей TableB через внешний ключ (FKI, FK2):

SELECT

TableA.COL1,

TableA.COL2,

TableB.COLX,

TableB.COLY

FROM TableA JOIN TableB

ON TableA.PKI = TableB.FKI

AND TableA.PKI = TableB.FK2

WHERE ...

<p>Смешивание неявного и явного синтаксисов</p>

Написание операторов, включающих смешивание неявного и явного синтаксисов, невозможно в Firebird 1.5 и допустимо (но обескураживает) в Firebird 1.0.x. Следующий пример показывает, как не надо писать оператор соединения:

SELECT

Table1.PK,

Table1.COL1,

Table2.PK,

Table2.COLX,

Table3.COLY

FROM Table1, Table2

JOIN Table3 ON TABLE 1. PK = Table3.FK

AND Table3.STATUS = 'SOLD' /* это условие поиска !! */

WHERE Table1.PK = Table2.FK

AND <другие-условия-поиска>

<p>Внешние соединения</p>

В отличие от внутреннего соединения оператор внешнего соединения выбирает строки участвующих таблиц, даже если в некоторых случаях не найдено соответствие. Когда полное соответствие строк не может быть сформировано соединением, тогда "отсутствующие" элементы данных формируются как NULL. Другое название внешнего соединения - включающее соединение.

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

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных