Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Более сложные примеры соединений




Количество выполняемых соединений таблиц в одном операторе 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. Двойное внешнее соединение – список всех членов экипажа с указанием их роли, номера авиалинии и даты вылета

Дата вылета Авиалиния ФИО Роль
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, поменяв местами соединяемые таблицы. Выполните оператор:

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, объединение шести таблиц.

Имя Отчество Фамилия Салон Место Стоимость
Ирина Валентиновна Щекина Бизнес 4A  
Константин Игоревич Баталов Бизнес  
Ольга Юрьевна Боброва Бизнес  
Елена Павловна Бельтюкова Бизнес  
Светлана Леонидовна Верушкина Бизнес  
Александр Александрович Чудинов Бизнес  
Сергей Владимирович Богатырев Бизнес  
Владимир Николаевич Карпов Бизнес  
Татьяна Викторовна Владысик Бизнес  
Наталья Васильевна Вожакова Бизнес  
Владимир Юрьевич Войтович Бизнес  
Елена Александровна Воронюк Эконом 20А  
Мария Ивановна Выгузова Эконом 20Б  
Ольга Николаевна Вяткина Эконом 20В  
Юлия Дмитриевна Гаевская Эконом 20Г  
Василий Александрович Глазов Эконом 20Д  
Дмитрий Федорович Глумов Эконом 21А  

Последний пример демонстрирует использование соединения таблиц в сочетании с группировкой. Найдем суммарную стоимость проданных за 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 год билетов для каждой из авиакомпаний.

Авиакомпания Стоимость
S7 Airlines  
Lufthansa  
Сибавиатранс  
Ютэйр-экспресс  
Sky express  
Аэрофлот-РА  
Поделиться:





Читайте также:

A) соглашение двух или более субъектов, содержащее общеобязательные юридические нормы
K Сравните оба определения и скажите, которое из них вам представляется более полным/научным и почему.
N Рассмотрим поведение более сложного контура.
Q При каких мозговых поражениях происходят наиболее грубые нарушения ориентировки в текущем времени?
Q При какой локализации поражения мозга наиболее отчетливо проявляются нарушения понимания именно переносного смысла, подтекста речи?
Q Приведите, пожалуйста примеры нарушений выполнения этой пробы при различных видах афазий.
Q Приведите, пожалуйста, примеры подобных нарушений внимания. Наиболее показательные примеры, на наш взгляд, относятся к сфере интеллектуальной деятельности и памяти.
S: Наиболее информативные биохимические показатели для диагностики гепатита В в остром периоде
А как бы вы, уважаемые читатели, ответили себе на этот вопрос? Что вам известно об этом сравнительно небольшом европейском государстве, наиболее часто именуемом Голландией?
Архиватор —это программа, осуществляющая сжатие и/или упаковку одного и более файлов в архив или серию архивов для удобства переноса или хранения, а также распаковку архивов.






Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...