|
Программирование >> Построение запросов sql
Рис. 3.108. Результат использования условия EXISTS при соединении Примечание. Предикат EXISTS нельзя использовать в случае, если вложенный запрос возвращает значение агрегатной функции. 3.3.3. Объединение результатов нескольких запросов При получении данных из таблиц БД необходимость в объединении результатов двух или более запросов в одну таблицу реализуется с помощью предложения UNION. Предложение UNION объединяет вывод двух или более запросов в единый набор строк и столбцов и имеет вид: Запрос Х UNION [{DISTINCT ALL}] Запрос У UNION [{DISTINCT ALL}] Запрос 7 Чтобы таблицы результатов нескольких запросов можно было объединять с помощью предложения UNION, они должны соответствовать следующим требованиям: - содержать одинаковое число столбцов; - тип данных каждого столбца любой таблицы должен совпадать с типом данных соответствующего столбца любой другой таблицы; - ни одна из таблиц промежуточного запроса не может быть отсортирована с помощью предложения ORDER BY; - разрешается использовать в списке возвращаемых элементов только имена столбцов или указывать все столбцы (SELECT *) и запрещается использовать выражения. Объединение таблиц с помощью предложения UNION отличается от вложенных запросов и соединений таблиц тем, что в нем ни один из двух (или больше) запросов не управляет другим запросом. Все запросы выполняются независимо друг от друга, а уже их вывод объединяется. Например, необходимо вывести как единое целое всех абонентов и исполнителей ремонтных заявок, фамилии которых начинаются на букву Ш . Для этого можно использовать следующий запрос: SELECT Fio AS AbonentFio FROM Abonent WHERE Fio LIKE UNION SELECT Fio FROM Executor WHERE Fio LIKE Ш%;. Результат объединения представлен на рис. 3.109. ABONENTFIO ШКОЛЬНИКОВ С.М. ШЛЮКОВ М.К. ШМАКОВ С.В. ШУБИН В.Г. ШУБИНА Т.П. Рис. 3.109. Результат объединения двух запросов Примечания. 1. Имена атрибутов в ТРЗ берутся как имена возвращаемых элементов в первом запросе (или псевдоним столбца, как в предыдущем примере). 2. Только последний запрос заканчивается точкой с запятой. Отсутствие точки с запятой после первого запроса дает понять SQL, что имеется еще один или более запросов. Объединение таблиц с помощью предложения UNION DISTINCT используется как синоним просто UNION для автоматического исключения дубликатов строк из вывода. Однако в соответствии со стандартом исключение дубликатов строк из вывода является режимом по умолчанию, поэтому слово DISTINCT использовать необязательно. Чтобы включить все строки в вывод запроса, следует указать UNION ALL. Допустим, если бы был не только исполнитель с именем Школьников С.М., но и абонент с таким же именем и вместо UNION использовался бы UNION ALL, то тогда строка с именем Школьников С.М. была бы выведена два раза. Предложения UNION и UNION ALL могут быть скомбинированы, чтобы удалять одни дубликаты, не удаляя других. Объединение запросов: (Запрос Х UNION ALL Запрос У) UNION Запрос 7; не обязательно даст те же результаты, что объединение запросов: Запрос Х UNION ALL (Запрос У UNION Запрос 7);, т.к. дублирующиеся строки удалятся при использовании UNION без ALL. Результаты выполнения промежуточных запросов, участвующих в объединении, упорядочивать запрещено, однако результирующий набор можно отсортировать, но только указывая порядковые номера для определения порядка столбцов. Например, объединить в одну таблицу информацию об услугах газоснабжения и неисправностях газового оборудования, а результат отсортировать по наименованию неисправности в обратном алфавитном порядке можно с помощью следующего запроса: SELECT FailureCD, FailureNM FROM Disrepair UNION ALL SELECT GazServiceCD, GazServiceNM FROM Services ORDER BY 2 DESC;. Результат объединения представлен на рис. 3.110.
Рис. 3.110. Результат объединения двух запросов с сортировкой В объединяемых запросах, если требуется, можно использовать одну и ту же таблицу. Пусть, например, требуется вывести начисленные суммы за 2001 год, уменьшенные на 5%, если сумма меньше 30, на 10%, если сумма от 30 до 100, и на 20%, если сумма больше 100. Вывести также процент уменьшения, код начисления, прежнюю и новую начисленные суммы. Запрос будет выглядеть следующим образом: SELECT AccountCD,Снижение - 5%, NachislFactCD, NachislSum AS Old Sum, NachislSum*0.95 AS New Sum FROM NachislSumma WHERE NachislSum < 30 AND NachislYear = 2001 UNION SELECT AccountCD, Снижение - 10%, NachislFactCD, NachislSum, NachislSum*0.90 FROM NachislSumma WHERE (NachislSum between 30 and 100) AND NachislYear=2001 UNION SELECT AccountCD, Снижение - 20%, NachislFactCD, NachislSum, NachislSum*0.80 FROM NachislSumma WHERE NachislSum > 100 AND NachislYear = 2001;. Результат объединения представлен на рис. 3.111.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |