Устранение дублирования в 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 = B.STUDENT_ID AND B.MARK =
(SELECT 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 =
(SELECT MIN(MARK) FROM EXAM_MARKS С WHERE C.EXAM_DATE = В.EXAM_DATE) ) ;
Для отличия строк, выводимых первой и второй частями запроса, в них вставлены текстовые константы 'Макс оц' и 'Мин оц'.
В приведенном запросе агрегирующие функции используются в подзапросах. Это является нерациональным с точки зрения времени, затрачиваемого на выполнение запроса (см. раздел 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,
(SELECT 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 .MARK, E . EXAM_DATE
FROM STUDENT A,
(SELECT B.STUDENT_ID, B.MARK, B.EXAM_DATE FROM EXAM_MARKS B,
(SELECT 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 WHERE A.STUDENT_ID=E.STUDENT_ID
| Maya 3D графика в кино и телевидении Воздействие испытаний ядерного оружия на здоровье населения Объектно-ориентированный язык программирования Java Объектно-ориентированное программирование Delphi Библиотека визуальных компонентов VCL и ее базовые классы Кроссплатформенное программирование для Linux Элементы управления Win32 Элементы управления Windows XP Файлы и устройства ввода/вывода Что такое экспертная система? Объектно-ориентированное программирование Инструментальные средства разработки экспертных систем Программирование на языке CLIPS Критерии и количественные характеристики надежности Расчет характеристик надежности невостанавливаемых резервированных изделий Расчет надежности системы с постоянным резервированием Интегрирование тригонометрических функций ; |