|
Программирование >> Sql: полное руководство
это ограничение ослаблено, и в списке возвращаемых столбцов разрешено использовать простые выражения. Однако во многих СУБД не разрещается включать в инструкции select предложения group by или having, а в некоторых не разрешается использовать в списке возвращаемых столбцов статистические функции (т.е. нельзя использовать итоговые запросы, описанные в главе 8). Более того, есть СУБД (SQL Server), не поддерживающие саму операцию union. Запрос на объединение и повторяющиеся строки * Поскольку операция union объединяет строки из двух результатов запросов, вполне вероятно, что в полученной таблице будут содержаться повторяющиеся строки. Например, в запросе, представленном на рис. 6.15, стоимость товара REI-2A44L составляет $4500,00, поэтому он входит в результаты верхнего запроса из числа представленных на рисунке. Кроме того, в таблице orders для этого товара имеется заказ на сумму $31500,00, поэтому он входит и в результаты второго запроса. По умолчанию операция union в процессе своего выполнения удаляет повторяющиеся строки. Таким образом, в объединенных результатах запроса содержится только одна строка для товара REI-2A44L. Если в таблице результатов операции union необходимо сохранить повторяющиеся строки, сразу за ключевым словом union следует указать предикат all. Эта форма запроса вернет таблицу с повторяющимися строками: Вывести список всех товаров, цена которых превышает $2000 или которых было заказано более чем на $30000 за один раз.
Обратите внимание на то, что обработка повторяющихся строк в операции union и инструкции select осуществляется по-разному. Инструкция select по умолчанию оставляет такие строки (select all). Чтобы удалить их, необходимо явно указать предикат distinct. Операция union по умолчанию удаляет повторяющиеся строки. Чтобы оставить их, следует явно задать предикат all. Специалисты по работе с базами данных критиковали обработку повторяющихся строк в SQL и указывали на эту непоследовательность языка как на одну из проблем. Причина такой непоследовательности заключается в том, что в SQL в качестве установок по умолчанию выбираются наиболее часто используемые варианты: на практике большинство простых инструкций select не возвращает повторяющихся строк, поэтому по умолчанию принято не удалять их; g на практике большинство операций union возвращает повторяющиеся строки, что нежелательно, поэтому по умолчанию такие строки удаляются. Удаление повторяющихся строк из таблицы результатов запроса занимает много времени, особенно если таблица содержит большое количество строк. Если известно, что операция union не возвратит повторяющихся строк, необходимо явно указать предикат all, тогда запрос будет выполняться быстрее. Запрос но объединение и сортировка * Предложение order by нельзя использовать ни в одной из инструкций select, объединенных операцией union. Нет смысла выполнять сортировку результатов таких запросов, поскольку пользователь все равно не увидит их в чистом виде. Однако объединенные результаты запросов, возвращенные операцией union, можно отсортировать с помощью предложения order by, следующего за второй инструкцией select. Поскольку столбцы таблицы результатов запроса на объединение не имеют имен, в этом предложении следует указывать номера столбцов. Ниже показан тот же запрос, что и на рис. 6.15, в котором результаты дополнительно отсортированы по производителю и номеру товара: Вывести список всех товаров, цена которых превышает $2000 или которых было заказано более чем на $30000 за один раз; список отсортировать по наименованию производителя и номеру товара. SELECT MFR ID, PRODDCT ID FROM PRODUCTS WHERE PRICE > 2000.00 UNION SELECT DISTINCT MFR, PRODUCT FROM ORDERS WHERE AMOUNT > 30000.00 ORDER BY 1,2 ACI 4100Y ACI 4100Z IMM 775C REI 2A44L REI 2A4 4R Вложенные запросы на объединение * Операцию union можно использовать многократно, чтобы объединить результаты трех или более запросов так, как изображено на рис. 6.16. В результате объединения таблиц В и С получается одна объединенная таблица. Затем, с помощью другой операции union, эта таблица объединяется с таблицей А. Синтаксис запроса, представленного на рисунке, имеет следующий вид: SELECT * FROM А ONION (SELECT * FROM в UNION SELECT * FROM C) Bill Mary George Fred Julia Harry Таблица В !i 11 JuI la Harry Таблица С Bi 11 Mary George Harry Таблица A Bi 11 Mary George Fred [ UNION )- FWc d Тф. Вл&внные опрёцт Результаты запроса
Cunion]- 3i I I Mary George Fred Ju I la Harry Скобки в запросе показывают, какая операция union должна выполняться первой Независимо от того, удаляют ли все операции union повторяющиеся строки или сохраняют их, порядок выполнения инструкций не имеет значения. Следующие выражения полностью эквивалентны А UNION (В UNION С) (А UNION В) UNION С (А UNION С) UNION В и возвращают семь строк результатов запроса. Подобным образом три следующих выражения полностью эквивалентны и возвращают двенадцать строк результатов запроса, поскольку повторяющиеся строки сохраняются: А UNION ALL (В UNION ALL С) (А UNION ALL В) UNION ALL С (A UNION ALL C) UNION ALL В
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |