|
Программирование >> Формирование связанных подзапросов
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 имеются записи о студентах, в которых не указан идентификатор университета. Требуется составить список студентов с указанием наименова-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |