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

Объединение запросов




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

Команда UNION

Команда UNION используется для объединения результатов двух или более операторов SELECT с исключением повторяющихся строк. Другими словами, если строка попадает в вывод одного запроса, то второй раз она не выводится, даже если она возвращается вторым запросом. При использовании UNION в каждом из связываемых операторов SELECT должно быть выбрано одинаковое число столбцов, столбцы должны быть одинакового типа и следовать в том же порядке.

В составных запросах можно использовать ключевое слово ORDER BY. Однако ключевое слово ORDER BY в них можно использовать только для упорядочения результатов окончательного вывода обоих запросов. Поэтому в составном запросе допускается использовать только одно выражение с ключевым словом ORDER BY, хотя сам составной запрос может состоять из нескольких операторов SELECT На столбцы в выражении ключевого слова ORDER BY можно ссылаться как по псевдонимам, так и по их номерам в списке выбора

Допустим нам нужно найти всех прилетевших из Перми в Москву за определенное число. Человек может прилететь в качестве члена экипажа (если коды этой личности присутствует в таблице EQUIPAGE на заданное число), или в качестве пассажира (если у него есть билет на заданное число). Таким образом, требуется объединить два запроса, первый найдет фамилию, имя, отчество для всех членов экипажа прилетевших из Перми в Москву за 11.01.2008, а второй выведет фамилию, имя, отчество тех кто имеет билеты из Перми в Москву на это же число (такой запрос мы уже делали, когда исследовали соединения таблиц). Для того чтобы отличать пассажира от члена экипажа сделаем следующее, добавим в результат новое поле, где для первого запроса будет во всех строках содержаться один и тот же текст — «Член экипажа», второй запрос разместит в этом поле текст «Пассажир». Это дополнительное поле озаглавим как «Тип». Кроме этого добавим еще одно поле, в которое будем выводить дополнительную информацию, для запроса по членам экипажа будем выводить роль для данного члена, а для пассажиров номер места указанный в билете. Соответственно это поле мы так и озаглавим «Роль/Место».

Обратим внимание, что вновь введенные поля в двух запросах не совпадают по типу. Для того чтобы можно было использовать команду UNION необходимо привести типы этих полей во втором запросе к тому же типу, что и в первом. Преобразование данных к требуемому типу обеспечивает функция CAST. Для поля «Тип» должно быть сделано преобразование к типу CHAR(12), а для поля «Роль/Место» к типу VARCHAR(20).

Получаем запрос:[52]

 

SELECT P. PR_NAME2 AS "Имя",

P. PR_NAME3 AS "Отчество",

P. PR_NAME AS "Фамилия",

'Член экипажа' AS "Тип",

R. RNK_NAME AS "Роль/Место"

FROM PERSON P

INNER JOIN EQUIPAGE EQ ON EQ. EQ_PR_CODE = P. PR_CODE

INNER JOIN RANK R ON R. RNK_CODE = EQ. EQ_RNK_CODE

INNER JOIN AIRLINE AL ON AL. AL_NUM = EQ. EQ_FL_NUM

INNER JOIN AIRPORT AFROM ON AFROM. AP_CODE = AL. AL_AP_FROM

INNER JOIN CITY CFROM ON CFROM. CT_CODE = AFROM. AP_CT_CODE

INNER JOIN AIRPORT ATO ON ATO. AP_CODE = AL. AL_AP_TO

INNER JOIN CITY CTO ON CTO. CT_CODE = ATO. AP_CT_CODE

WHERE CFROM. CT_NAME = 'Пермь' AND CTO. CT_NAME = 'Москва'

AND EQ. EQ_FL_DATE = '11.01.2008'

UNION

SELECT P. PR_NAME2, P. PR_NAME3, P. PR_NAME,

CAST( 'Пассажир' AS CHAR( 12 )),

CAST( TC. TC_SEAT AS VARCHAR( 20 ))

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

В результате выполнения запроса получаем список:

Листинг 25. Результат объединения запросов (команды UNION) – список всех прилетевших из Перми в Москву 11.01.2008

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

 

Поделиться:





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





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



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