Программирование >>  Формирование связанных подзапросов 

1 2 3 4 [ 5 ] 6 7 8 ... 15


2.16. Устранение дублирования в UNION 65

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

SELECT CITY

FROM STUDENT UNION ALL

SELECT CITY

FROM LECTURER;

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

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

SELECT МЭКСОЦ, A.STUDENT ID, SURNAME, MARK, EXAM DATE FROM STUDENT A, EXAM MARKS В WHERE (A.STUDENT ID = B.STUDENT ID AND B.MARK =

(SECT MAX(MARK) FROM EXAM MARKS С

WHERE C.EXAM DATE = B.EXAM DATE) )

UNION ALL

SELECT МИНОЦ1, A.STUDENT ID, SURNAME, MARK, EXAM DATE

FROM STUDENT A, EXAM MARKS В

WHERE (A.STUDENT ID = B.STUDENT ID \

AND B.MARK =

(SECT MIN(MARK)

FROM EXAM MARKS С

WHERE C.EXAM DATE = В.EXAM DATE)) ;

Для отличия строк, вхводимхх первой и второй частями запроса, в них вставлен! текстовые константы Макс оц и Мин оц.

ЗЗак 444



В приведенном запросе агрегирующие функции используются в подзапросах. Это является нерациональнтм с точки зрения времени, затрачиваемого на вхполнение запроса (см. раздел 2.9). Более эффективна форма запроса, возвращающего ана-логичнтй результат:

SEIECT МаКСОЦ, A.STUDENT ID, SURNAME, E.MARK, E.EXAM DATE FROM STUDENT A,

(SELECT B.STUDENT ID, B.MARK, B.EXAM DATE FROM EXAM MARKS B,

(SECT MAX(MARK) AS MAX MARK, C.EXAM DATE

FROM EXAM MARKS С

GROUP BY C.EXAM DATE) D WHERE В.EXAM DATE = D.EXAM DATE AND B.MARK=MAX MARK) E WHERE A.STUDENT ID=E.STUDENT ID UNION ALL

SEMCT МИНО , A. STUDENT ID, SURNAME, E .M, E .EXAM DATE

FROM STUDENT A,

(SECT B.STUDENT ID, B.MARK, B.EXAM DATE FROM EXAM MARKS B,

(SECT MIN(MARK) AS MIN MARK, C.EXAM DATE FROM EXAM MARKS С GROUP BY C.EXAM DATE) D WHERE B.EXAM DATE = D.EXAM DATE AND B.MARK=MIN MARK) E WHEREA.STUDENT ID=E.STUDENT ID

2.17. Использование UNION с ORDER BY

Предложение ORDER BY применяется для упорядочения вы-ходнхх даннхх объединения запросов так же, как и для отдель-н1х запросов. Последний пример, при необходимости упорядо-



2.18. Внешнее объединение 67

чения в1ходн1х даннхх запроса по фамилиям студентов и датам экзаменов, может втглядеть следующим образом:

SELECT МЭКСОЦ, A.STUDENT ID, SURNAME, E.MARK, E.EXAM DATE FROM STUDENT A,

(SECT B.STUDENT ID, B.MARK, B.EXAM DATE FROM EXAM MARKS B,

(SELECT MAX (MARK) AS MAX MARK, C.EXAM DATE

FROM EXAM MARKS С

GROUP BY C.EXAM DATE) D WHERE B.EXAM DATE=D.EXAM DATE

AND B.MARK=MAX MARK) E

WHERE A.STUDENT ID=E.STUDENT ID UNION ALL

SECT МИНОЦ, A.STUDENT ID, SURNAME, E.MARK, E.EXAM DATE

FROM STUDENT A,

(SECT B.STUDENT ID, B.MARK, B.EXAM DATE FROM EXAM MARKS B,

(SCT N(MARK) AS MIN MARK, C.EXAM DATE FROM EXAM MARKS С GROUP BY C.EXAM DATE) D WHERE В.EXAM DATE=D.EXAM DATE

AND B.MARK=MIN MARK) E

WHERE A.STUDENT ID=E.STUDENT ID ORDER BY SURNAME,E.EXAM DATE;

2.18. Внешнее объединение

Часто бтвает полезна операция объединения двух запросов, в которой второй запрос выбирает строки, исключенные пер-в1м. Такая операция назтвается внешним объединением.

Рассмотрим пример. Пусть в таблице STUDENT имеются записи о студентах, в которых не указан идентификатор университета. Требуется составить список студентов с указанием наименова-



1 2 3 4 [ 5 ] 6 7 8 ... 15

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика