Более сложные примеры соединений
Количество выполняемых соединений таблиц в одном операторе SELECT не имеет физических ограничений, однако рекомендуется использовать их не более 16. Рассмотрим пример двойного внешнего соединения, т. е. тот случай, когда к первой таблице присоединяется не одна, а уже две таблицы. Чтобы увидеть фамилии с именами и отчествами всех членов экипажа с указанием их роли, номера авиалинии и даты вылета нужно выполнить два соединения таблицы EQUIPAGE с таблицей PERSON и с таблицей RANK. Введите и выполните оператор:[38] SELECT E. EQ_FL_DATE AS "Дата вылета", E. EQ_FL_NUM AS "Авиалиния", P. PR_NAME2 || ' ' || P. PR_NAME3 || ' ' || P. PR_NAME AS "ФИО", R. RNK_NAME AS "Роль" FROM EQUIPAGE E INNER JOIN PERSON P ON E. EQ_PR_CODE = P. PR_CODE INNER JOIN RANK R ON E. EQ_RNK_CODE = R. RNK_CODE WHERE E. EQ_FL_DATE BETWEEN '1.02.08' AND '29.02.08' ORDER BY E. EQ_FL_DATE, E. EQ_FL_NUM, 3 Вначале отбираются все члены экипажа из таблицы EQUIPAGE (здесь она становится главной) на основании условий предложения WHERE (все рейсы за февраль 2008). В выбранные строки добавляются полные имена из таблицы PERSON. Условием соединения является равенство кода в таблице PERSON коду человека в таблице EQUIPAGE. После чего к этим строкам добавляются названия роли из таблицы RANK. Здесь условием соединения является равенство кода, первичного ключа таблицы RANK коду роли в начальной, "главной", таблице EQUIPAGE. Результат сортируем по дате вылета, номеру авиалинии и фамилиям именам и отчествам (так как поле ФИО вычисляется, в списке сортировки указываем номер поля). В результате выполнения двойного соединения мы получим Листинг 19. Двойное внешнее соединение – список всех членов экипажа с указанием их роли, номера авиалинии и даты вылета
Необходимо отметить, что порядок указания соединяемых таблиц не имеет значения. Здесь важно задать первую, "главную", таблицу сразу после ключевого слова FROM, все остальные соединяемые таблицы "подключаются" к строкам, выбранным именно из этой таблицы, и ее строки выбираются на основании условия в предложении WHERE.
Для иллюстрации этого изменим предыдущий оператор SELECT, поменяв местами соединяемые таблицы. Выполните оператор: SELECT E. EQ_FL_DATE AS "Дата вылета", E. EQ_FL_NUM AS "Авиалиния", P. PR_NAME2 || ' ' || P. PR_NAME3 || ' ' || P. PR_NAME AS "ФИО", R. RNK_NAME AS "Роль" FROM PERSON P INNER JOIN EQUIPAGE E ON E. EQ_PR_CODE = P. PR_CODE INNER JOIN RANK R ON E. EQ_RNK_CODE = R. RNK_CODE WHERE E. EQ_FL_DATE BETWEEN '1.02.08' AND '29.02.08' ORDER BY E. EQ_FL_DATE, E. EQ_FL_NUM, 3 В качестве главной таблицы мы задали таблицу PERSON, в результате получим точно такой же список, как и в предыдущем случае. Приведем еще один более сложный пример, который требует соединения четырех таблиц. Выведем тариф для всех рейсов вылетающих из города «Пермь». Мы должны получить название аэропорта прилета, номер маршрута, вид салона и саму стоимость билета. Выполните оператор:
SELECT T. TR_AL_NUM AS "Номер Авиалинии", ATO. AP_NAME AS "Аэропорт прилета", S. SL_NAME AS "Салон", T. TR_COST AS "Стоимость" FROM TARIFF T INNER JOIN AIRPORT AFROM ON ( T. TR_AP_FROM = AFROM. AP_CODE ) INNER JOIN AIRPORT ATO ON ( T. TR_AP_TO = ATO. AP_CODE ) INNER JOIN SALON S ON ( T. TR_SL_TYPE = S. SL_TYPE ) 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 используются два раза, для них используются различные синонимы. Приводим вид запроса:[39]
SELECT PR_NAME2 AS "Имя", PR_NAME3 AS "Отчество", PR_NAME AS "Фамилия", S. SL_NAME AS "Салон", TC. TC_SEAT AS "Место", TR. TR_COST AS "Стоимость" FROM PERSON P INNER JOIN TICKET TC ON TC. TC_PR_CODE = P. PR_CODE INNER JOIN TARIFF TR ON TR. TR_CODE = TC. TC_TR_CODE INNER JOIN SALON S ON TR. TR_SL_TYPE = S. SL_TYPE INNER JOIN AIRPORT AFROM ON AFROM. AP_CODE = TR. TR_AP_FROM INNER JOIN CITY CFROM ON CFROM. CT_CODE = AFROM. AP_CT_CODE INNER JOIN AIRPORT ATO ON ATO. AP_CODE = TR. TR_AP_TO INNER JOIN CITY CTO ON CTO. CT_CODE = ATO. AP_CT_CODE WHERE CFROM. CT_NAME = 'Пермь' AND CTO. CT_NAME = 'Москва' AND TC. TC_FL_DATE = '11.01.2008' Получаем список: Листинг 20. Список купивших билеты из Перми в Москву на 11.01.2008, объединение шести таблиц.
Последний пример демонстрирует использование соединения таблиц в сочетании с группировкой. Найдем суммарную стоимость проданных за 2008 год билетов для каждой из авиакомпаний. Для того чтобы найти то что нам требуется нужно просуммировать стоимость билета из таблицы TARIFF для каждого проданного (за указанный год) билета. В список вывода нужно поместить наименование авиакомпании и сумму стоимостей из таблицы TARIFF. Результат должен быть сгруппирован по наименованиям авиакомпаний. Для наглядности упорядочим выводимые строки по величине суммы. Введем запрос:[40] SELECT AC. AC_NAME AS “Авиакомпания“, SUM( TRF. TR_COST ) AS “Стоимость” FROM TARIFF TRF INNER JOIN TICKET TC ON ( TRF. TR_CODE = TC. TC_TR_CODE ) INNER JOIN AIRLINE AL ON ( TRF. TR_AL_NUM = AL. AL_NUM ) INNER JOIN AIRCOMPANY AC ON ( AL. AL_AC_CODE = AC. AC_CODE ) GROUP BY AC. AC_NAME ORDER BY 2 В результате получим список: Листинг 21. Результат объединения и группировки, суммарная стоимость проданных за 2008 год билетов для каждой из авиакомпаний.
Читайте также: A) соглашение двух или более субъектов, содержащее общеобязательные юридические нормы Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|