Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие по SQL.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
960 Кб
Скачать

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

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

Получаем запрос:lii

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А