Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL97-4E.DOC
Скачиваний:
3
Добавлен:
05.11.2018
Размер:
3.3 Mб
Скачать

4.5. Объединение результатов нескольких запросов

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

Результаты объединяемых запросов обязательно должны быть совместимы по следующим признакам:

1) количество полей в результатах каждого запроса должно быть одинаковым;

2) поля с одинаковыми порядковыми номерами в каждом из запросов должны иметь полностью идентичные тип данных и длину их представления.

Выполним простое объединение двух таблиц, содержащих сведения о должностях и о факультетах. Количество полей в каждой из них равно двум, типы полей совпадают. Для того, чтобы было ясно, где в результирующей таблице находятся строки каждого запроса, включим в запросы комментарии - тексты равной длины (данная возможность не поддерживается стандартом ANSI SQL, но допускается во многих реализациях SQL).

SELECT Npost, 'Должность', Cname FROM Post

UNION

SELECT Ndep, 'Факультет', Cname FROM Depart

Результат выполнения объединенного запроса:

Npost Exp_2 Cname

10 Должность Преподаватель

20 Должность Ст. преподаватель

30 Должность Доцент

40 Должность Профессор

50 Должность Зав. кафедрой

100 Факультет Математический

200 Факультет Физический

300 Факультет Экономический

Особенностью выполнения объединия запросов является исключение из результата идентичных строк, подобно тому, как это обеспечивает ключевое слово DISTINCT в отдельном запросе. Поэтому объединение нескольких запросов к одной таблице не вызовет дублирования ее строк - каждая строка появится в результате в единственном экземпляре.

SELECT * FROM Post

UNION

SELECT * FROM Post

Npost Cname

10 Преподаватель

20 Ст. преподаватель

30 Доцент

40 Профессор

50 Зав. кафедрой

Однако если все же необходимо оставить в объединенном запросе все идентичные строки, используйте вместо UNION предложение UNION ALL:

SELECT * FROM Post

UNION ALL

SELECT * FROM Post

Npost Cname

10 Преподаватель

20 Ст. преподаватель

30 Доцент

40 Профессор

50 Зав. кафедрой

10 Преподаватель

20 Ст. преподаватель

30 Доцент

40 Профессор

50 Зав. кафедрой

Далее следует еще один пример объединения двух запросов. Этот запрос позволяет выявить дисциплины с минимальным и максимальным объемом занятий по ним, а также преподавателей, ведущих занятия. Результаты запроса упорядочены в первую очередь по объему занятий, во вторую - по фамилиям преподавателей. Предложение ORDER BY в примере определяет порядок строк в таблице, полученной объединением двух запросов, а не в последнем из объединяемых запросов.

SELECT ‘Минимум ’,A.Cname,Nhour,B.Cname

FROM Subject A,Teacher B

WHERE A.Nteach=B.Nteach AND

Nhour=( SELECT MIN(Nhour) FROM Subject )

UNION

SELECT ‘Максимум’,A.Cname,Nhour,B.Cname

FROM Subject A,Teacher B

WHERE A.Nteach=B.Nteach AND

Nhour=( SELECT MAX(Nhour) FROM Subject )

ORDER BY 3 ASC, 4 ASC

Exp_1 Cname_A Nhour Cname_B

Минимум Практикум на ЭВМ 30 Бердино Н.Ю.

Минимум Физика 30 Стефанович Г.Б.

Максимум Экономическая география 90 Литвинас А.П.

Максимум Информационные системы 90 Поляков В.В.

Обратите внимание, что в последнем приведенном примере в каждом из объединяемых запросов ряд столбцов результирующей таблицы указывается с использованием алиасов (временных имен таблиц), а часть без них. Вспомните, почему это возможно.

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

Запрос-1 UNION Запрос-2 UNION Запрос-3

( Запрос-1 UNION Запрос-2 ) UNION Запрос-3

Запрос-1 UNION ( Запрос-2 UNION Запрос-3 )

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

Упражнения к разделу 4.5

1. Сформулируйте запрос, который позволит получить в виде одной таблицы список преподавателей и студентов математического факультета (с пояснениями “Студент” возле фамилий студентов и наименований занимаемых должностей возле фамилий преподавателей). В результирующей таблице первыми в списке должны идти все студенты, а за ними все преподаватели. Фамилии студентов должны быть упорядочены по алфавиту. Фамилии преподавателей должны располагаться в порядке убывания кода должности, а при наличии нескольких преподавателей с одной должностью они должны быть также упорядочены по алфавиту.

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

При выполнении этого задания у Вас должны возникнуть проблемы совместимости данных, получаемых в каждом из объединяемых запросов. В СУБД FoxPro разрешить их можно с помощью функции PADC( ) или LEFT( ).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]