Вход/Регистрация
Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
вернуться

Борри Хелен

Шрифт:

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 ...

Смешивание неявного и явного синтаксисов

Написание операторов, включающих смешивание неявного и явного синтаксисов, невозможно в 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 <другие-условия-поиска>

Внешние соединения

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

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

"Левый" и "правый" значимы в логике спецификаций внешнего соединения. Внешнее соединение может быть левым, правым и полным. Каждый тип внешнего соединения создает различный выходной набор данных из тех же входных потоков. Ключевые слова LEFT, RIGHT и FULL достаточны для установления факта, что соединение "внешнее"; ключевое слово OUTER является необязательной частью синтаксиса.

LEFT OUTER JOIN

Левое внешнее соединение (LEFT OUTER [78] JOIN) в запросе создает набор данных, состоящий из полностью заполненных столбцов, где найдены соответствующие строки (как и во внутреннем соединении), а также частично заполненных строк для каждого экземпляра, где соответствие правой стороны не найдено для ключа левой стороны. Несоответствующие столбцы будут "заполнены" значением NULL. Вот оператор, использующий те же входные потоки, что и наш пример INNER JOIN:

78

Ключевое слово OUTER для всех случаев является необязательным.
–

SELECT

Table1.PK,

Table1.COL1,

Table2.PKX,

Table2.COLX

FROM Table1 LEFT OUTER JOIN Table2

ON Table1.PK = Table2.FK

WHERE ... <условия-поиска>

На рис. 22.2 показано, как будут объединены потоки для левого соединения.

Рис. 22.2. Левое соединение

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

RIGHT OUTER JOIN

Правое внешнее соединение (RIGHT OUTER JOIN) в запросе создает набор данных, содержащий полностью заполненные столбцы, где были найдены соответствующие строки (как и во внутреннем соединении), а также частично заполненные строки для каждого экземпляра, где существует правая строка, не имеющая соответствия с левым потоком. Не имеющие соответствия столбцы будут "заполнены" значением NULL. Вот оператор, использующий те же входные потоки, что и наш пример INNER JOIN. Необязательное ключевое слово OUTER здесь отсутствует.

SELECT

Table1.PK,

Table1.COL1,

Table2.PKX,

Table2.COLX

FROM Table1 RIGHT JOIN Table2

ON Table1.PK = Table2.FK

WHERE ... <условия-поиска>

На рис. 22.3 показано, как будут объединены потоки для правого соединения.

Рис. 22.3. Правое соединение

FULL OUTER JOIN

Полное внешнее соединение (FULL OUTER JOIN) является целиком включающим. Оно возвращает одну строку для каждой пары соответствующих потоков и одну частично заполненную строку для каждой строки из каждого потока, где соответствие не было найдено. Данное соединение объединяет поведение правого и левого соединений.

  • Читать дальше
  • 1
  • ...
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: