Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭУМКД_БД_2.doc
Скачиваний:
20
Добавлен:
23.09.2019
Размер:
6.01 Mб
Скачать

1.3.19. Сложные запросы

Объединение результатов нескольких запросов (операция UNION)

Иногда появляется необходимость объединения результатов двух или более запросов в одну таблицу. SQL поддерживает такую возможность с помощью операции UNION.

Рисунок иллюстрирует использование операции UNION для выполнения следующего запроса на объединение: вывести за один раз список всех товаров, цена которых превышает $2000 или которых было заказано более чем на $30000.

Рисунок 1.3.19.1 – Сложный запрос

Первой части основного запроса удовлетворяет запрос, изображенный в верхней части рисунка:

SELECT MFR_ID, PR0DUCT_ID FROM PRODUCTS WHERE PRICE > 2000.00

Подобным же образом вторую часть основного запроса можно выполнить с помощью запроса, изображенного в нижней части рисунка:

SELECT DISTINCT MFR, PRODUCT FROM ORDERS WHERE AMOUNT > 30000.00

Чтобы таблицы результатов запроса можно было объединить с помощью операции UNION, они должны соответствовать следующим требованиям:

две таблицы должны содержать одинаковое число столбцов;

тип данных каждого столбца первой таблицы должен совпадать с типом данных соответствующего столбца во второй таблице;

ни одна из двух таблиц не может быть отсортирована с помощью предложения ORDER BY; однако объединённые результаты запроса можно отсортировать.

Обратите внимание на то, что имена столбцов в двух запросах, объединённых с помощью операции UNION, не обязательно должны быть одинаковыми. В предыдущем примере в первой таблице результатов запроса имеются столбцы с именами MFR_ID и PRODUCT_ID, в то время как во второй таблице результатов запроса соответствующие им столбцы имеют имена MFR и PRODUCT. Поскольку столбцы в двух таблицах могут иметь различные имена, столбцы результатов запроса, возвращенные операцией UNION, являются безымянными.

Стандарт ANSI/ISO накладывает дополнительные ограничения на инструкции SELECT, участвующие в операции UNION. Он разрешает использовать в списке возвращаемых столбцов только имена столбцов или указатель на все столбцы (SELECT *) и запрещает использовать выражения. В большинстве СУБД, тем не менее, это ограничение ослаблено, и в списке возвращаемых столбцов разрешено использовать простые выражения. Однако во многих СУБД не разрешается включать в инструкции SELECT предложения GROUP BY или HAVING, а в некоторых не разрешается использовать в списке возвращаемых столбцов статистические функции. Более того, есть СУБД, не поддерживающие саму операцию UNION.

1.3.20. Запросы на объединение и повторяющиеся строки

Поскольку операция UNION объединяет строки из двух результатов запросов, вполне вероятно, что в полученной таблице будут содержаться повторяющиеся строки. По умолчанию операция UNION в процессе своего выполнения удаляет повторяющиеся строки.

Если в таблице результатов операции UNION необходимо сохранить повторяющиеся строки, сразу за ключевым словом UNION следует указать предикат ALL. Эта форма запроса вернёт таблицу с повторяющимися строками.

Обратите внимание на то, что обработка повторяющихся строк в операции UNION и инструкции SELECT осуществляется по-разному. Инструкция SELECT по умолчанию оставляет такие строки (SELECT ALL). Чтобы удалить их, необходимо явно указать предикат DISTINCT. Операция UNION по умолчанию удаляет повторяющиеся строки. Чтобы оставить их, следует явно задать предикат ALL.

Специалисты по работе с базами данных критиковали обработку повторяющихся строк в SQL и указывали на эту "непоследовательность" языка как на одну из проблем. Причина такой "непоследовательности" заключается в том, что в SQL в качестве установок по умолчанию выбираются наиболее часто используемые варианты: на практике большинство простых инструкций SELECT не возвращает повторяющихся строк, поэтому по умолчанию принято не удалять их, в то время как большинство операций UNION возвращает повторяющиеся строки, что нежелательно, поэтому по умолчанию такие строки удаляются. Удаление повторяющихся строк из таблицы результатов запроса занимает много времени, особенно если таблица содержит большое количество строк. Если известно, что операция UNION не возвратит повторяющихся строк, необходимо явно указать предикат ALL, тогда запрос будет выполняться быстрее.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]