Программирование >>  Построение запросов sql 

1 ... 48 49 50 [ 51 ] 52 53 54 ... 101


FAILURECD

FAILURENM

Засорилась водогрейная колонка

Не горит АГВ

Плохое поступление газа на горелку плиты

Туго поворачивается пробка крана плиты

При закрытии краника горелка плиты не гаснет

Неизвестна

Рис. 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.



FAILURECD

FAILURENM

Туго поворачивается пробка крана плиты

Течет из водогрейной колонки

При закрытии краника горелка плиты не гаснет

Плохое поступление газа на горелку плиты

Неисправна печная горелка

Неисправен газовый счетчик

Неизвестна

Не горит АГВ

Заявочный ремонт ГО

Засорилась водогрейная колонка

Доставка газа

Рис. 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.

ACCOUNTCD

NACHISLFACTCD

OLD SUM

NEW SUM

005488

Снижение - 10%

58,70

52,8300

080047

Снижение - 10%

80,00

72,0000

080047

Снижение - 10%

32,56

29,3040

080270

Снижение - 10%

46,00

41,4000



1 ... 48 49 50 [ 51 ] 52 53 54 ... 101

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