FULL (OUTER) - тип соединения "полное (внешнее)". Это комбинация левого и правого соединений. В полное соединение включаются все строки из обеих таблиц. Для совпадающих строк поля заполняются реальными значениями, для несовпадающих строк поля заполняются в соответствии с правилами левого и правого соединений. На практике этот тип соединения требуется чрезвычайно редко. Поэтому примеров мы приводить не будем.
Более сложные примеры соединений
Количество выполняемых соединений таблиц в одном операторе SELECT не имеет физических ограничений, однако рекомендуется использовать их не более 16.
Рассмотрим пример двойного внешнего соединения, т. е. тот случай, когда к первой таблице присоединяется не одна, а уже две таблицы.
Чтобы увидеть фамилии с именами и отчествами всех членов экипажа с указанием их роли, номера авиалинии и даты вылета нужно выполнить два соединения таблицы EQUIPAGE с таблицей PERSON и с таблицей RANK.
Вначале отбираются все члены экипажа из таблицы EQUIPAGE (здесь она становится главной) на основании условий предложения WHERE (все рейсы за февраль 2008). В выбранные строки добавляются полные имена из таблицы PERSON. Условием соединения является равенство кода в таблице PERSON коду человека в таблице EQUIPAGE. После чего к этим строкам добавляются названия роли из таблицы RANK. Здесь условием соединения является равенство кода, первичного ключа таблицы RANK коду роли в начальной, "главной", таблице EQUIPAGE. Результат сортируем по дате вылета, номеру авиалинии и фамилиям именам и отчествам (так как поле ФИО вычисляется, в списке сортировки указываем номер поля).
В результате выполнения двойного соединения мы получим
Листинг 19. Двойное внешнее соединение – список всех членов экипажа с указанием их роли, номера авиалинии и даты вылета
Дата вылета
Авиалиния
ФИО
Роль
13.02.2008
Анна Валерьевна Грунтович
Борт проводник
13.02.2008
Евгений Андреевнич Болотов
Командир
13.02.2008
Людмила Александровна Блинова
Борт проводник
13.02.2008
Марина Владимировна Волченко
Борт проводник
13.02.2008
Наталья Николаевна Васюкова
Борт проводник
13.02.2008
Павел Павлович Попутько
Пилот
14.02.2008
Анна Евгеньевна Елизарова
Борт проводник
14.02.2008
Вера Раисовна Дударева
Борт проводник
14.02.2008
Екатерина Викторовна Еремеева
Борт проводник
14.02.2008
Елена Ильинична Жукова
Борт проводник
14.02.2008
Семен Валерьевич Дудин
Командир
14.02.2008
Юлий Альбертович Алексеев
Пилот
15.02.2008
Анна Валерьевна Грунтович
Борт проводник
15.02.2008
Евгений Андреевнич Болотов
Командир
15.02.2008
Елена Анатольевна Мичурина
Борт проводник
15.02.2008
Марина Владимировна Волченко
Борт проводник
15.02.2008
Сергей Иванович Ридель
Пилот
15.02.2008
Татьяна Александровна Соснина
Борт проводник
Необходимо отметить, что порядок указания соединяемых таблиц не имеет значения. Здесь важно задать первую, "главную", таблицу сразу после ключевого слова FROM, все остальные соединяемые таблицы "подключаются" к строкам, выбранным именно из этой таблицы, и ее строки выбираются на основании условия в предложении WHERE.
Для иллюстрации этого изменим предыдущий оператор SELECT, поменяв местами соединяемые таблицы. Выполните оператор:
В качестве главной таблицы мы задали таблицу PERSON, в результате получим точно такой же список, как и в предыдущем случае.
Приведем еще один более сложный пример, который требует соединения четырех таблиц. Выведем тариф для всех рейсов вылетающих из города «Пермь». Мы должны получить название аэропорта прилета, номер маршрута, вид салона и саму стоимость билета. Выполните оператор:
INNER JOIN CITY C ON (AFROM.AP_CT_CODE= C.CT_CODE)
WHERE C.CT_NAME = 'Пермь'
Таким образом, в запросе будут задействованы следующие таблицы: TARIFF, AIRPORT, SALON, CITY. Обратите внимание, что таблица AIRPORT используется в запросе два раза – один раз мы используем соединение используя поле TR_AP_TO таблицы TARIFF, таблица в этом соединении обозначается псевдонимом ATO и означает аэропорт прилета, второй раз в соединении используется поле TR_AP_FROM, в этом случае таблица AIRPORT будет обозначаться псевдонимом AFROM и означает аэропорт вылета.
Следующий пример потребует объединения шести таблиц. Получим список (фамилию, имя, отчество) тех кто имеет билеты из Перми в Москву на 11.01.2008, кроме фамилии имени отчества выведем вид салона, стоимость билета и занимаемое место. В запросе мы должны связать следующие таблицы: PERSON связываем с таблицей TICKET, TICKET – с TARIFF, TARIFF – с SALON, далее TARIFF дважды связываем а AIRPORT (первый раз связываем используя поле TR_AP_FROM, т.е. определяя аэропорт вылета, второй раз связываем используя поле TR_AP_TO, тем самым будет определен аэропорт прилета), AIRPORT дважды связывается с CITY (один раз для города, где размещен аэропорт вылета, второй раз связь будет определять город, где размещен аэропорт прилета). Так как таблицы AIRPORT и CITY используются два раза, для них используются различные синонимы.
WHERE CFROM.CT_NAME='Пермь'ANDCTO.CT_NAME='Москва'
AND TC.TC_FL_DATE='11.01.2008'
Получаем список:
Листинг 20. Список купивших билеты из Перми в Москву на 11.01.2008, объединение шести таблиц.
Имя
Отчество
Фамилия
Салон
Место
Стоимость
Ирина
Валентиновна
Щекина
Бизнес
4A
Константин
Игоревич
Баталов
Бизнес
4Б
Ольга
Юрьевна
Боброва
Бизнес
4Г
Елена
Павловна
Бельтюкова
Бизнес
5А
Светлана
Леонидовна
Верушкина
Бизнес
5В
Александр
Александрович
Чудинов
Бизнес
5Г
Сергей
Владимирович
Богатырев
Бизнес
6А
Владимир
Николаевич
Карпов
Бизнес
3Б
Татьяна
Викторовна
Владысик
Бизнес
3Г
Наталья
Васильевна
Вожакова
Бизнес
2А
Владимир
Юрьевич
Войтович
Бизнес
2Б
Елена
Александровна
Воронюк
Эконом
20А
Мария
Ивановна
Выгузова
Эконом
20Б
Ольга
Николаевна
Вяткина
Эконом
20В
Юлия
Дмитриевна
Гаевская
Эконом
20Г
Василий
Александрович
Глазов
Эконом
20Д
Дмитрий
Федорович
Глумов
Эконом
21А
Последний пример демонстрирует использование соединения таблиц в сочетании с группировкой. Найдем суммарную стоимость проданных за 2008 год билетов для каждой из авиакомпаний. Для того чтобы найти то что нам требуется нужно просуммировать стоимость билета из таблицы TARIFF для каждого проданного (за указанный год) билета. В список вывода нужно поместить наименование авиакомпании и сумму стоимостей из таблицы TARIFF. Результат должен быть сгруппирован по наименованиям авиакомпаний. Для наглядности упорядочим выводимые строки по величине суммы.