Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
Синтаксис явного INNER JOIN в SQL-92
Явное внутреннее соединение является предпочтительным для 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 ...
Смешивание неявного и явного синтаксисов
Написание операторов, включающих смешивание неявного и явного синтаксисов, невозможно в 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) является целиком включающим. Оно возвращает одну строку для каждой пары соответствующих потоков и одну частично заполненную строку для каждой строки из каждого потока, где соответствие не было найдено. Данное соединение объединяет поведение правого и левого соединений.
Младший сын князя. Том 10
10. Аналитик
Фантастика:
городское фэнтези
аниме
сказочная фантастика
фэнтези
фантастика: прочее
рейтинг книги
Бастард Императора. Том 8
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
рейтинг книги
Феномен
2. Уникум
Фантастика:
боевая фантастика
рейтинг книги
Идеальный мир для Демонолога 4
4. Демонолог
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
рейтинг книги
Чиновникъ Особых поручений
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
рейтинг книги
Осознание. Пятый пояс
14. Путь
Фантастика:
героическая фантастика
рейтинг книги
Офицер Красной Армии
2. Командир Красной Армии
Фантастика:
попаданцы
рейтинг книги
