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

В отличие от обычных запросов UNION автоматически исклю­чает из выходных данных дубликаты строк, например, в запросе

SELECT CITY

FROM STUDENT UNION

SELECT CITY

FROM LECTURER ;

совпадающие наименования городов будут исключены.

Если все же необходимо в каждом запросе вывести все стро­ки независимо оттого, имеются ли такие же строки в других объ­единяемых запросах, то следует использовать во множественном запросе конструкцию с оператором 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   =   В.STUDENT_ID AND B.MARK =

(SELECT MAX(MARK) FROM EXAM_MARKS С

WHERE C.EXAM_DATE = В.EXAM_DATE) )

UNION ALL

™-,TmT1 ,,„„,„„1, A. STUDENT_ID, SURNAME, MARK, EXAM_DATE

>.r.\    i шшиц

FROM STUDENT A, EXAM_MARKS В

WHERE    (A. STUDENT_I D  =   В . STUDENT_I D \ AND B.MARK =

(SELECT MIN (MARK) FROM EXAM_MARKS С

WHERE C.EXAM_DATE = B.EXAM_DATE) ) ;

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

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

SEIECT "МаГООЦ' , A.STUDENT_ID, SURNAME, E.MARK, E.EXAM_DATE FROM STUDENT A,

(SELECT B.STUDENT_ID, B.MARK, В.EXAM_DATE FROM EXAM_MARKS B,

(SELECT MAX (MARK I   AS MAX_MARK, C.EXAM_DATE FROM EXAM    MARKS С GROUP BY С.EXAM_DATEI D WHERE B.EXAM_DATE=D.EXAM_DATE AND В.MARK=MAX_MARKI E WHERE A. STUDENT_ID=E . STUDENT_ID UNION ALL

SKMCT "МПСЦ" , 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,

(SELECT МШ(MARK)   AS MIN_MARK, С.EXAM_DATE FROM EXAM_MAKKS С GROUP BY C.EXAM_DATE) D WHERE В.EXAM_DATE=D.EXAM_DATE AND B.MARK=MIN_MARK) E WHEREA.STUDENT_ID=E.STUDENT_ID