Программирование >>  Sql: полное руководство 

1 ... 35 36 37 [ 38 ] 39 40 41 ... 264


это ограничение ослаблено, и в списке возвращаемых столбцов разрешено использовать простые выражения. Однако во многих СУБД не разрещается включать в инструкции 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 за один раз.

SELECT

MFR ID, PRODUCT ID

FROM

PRODUCTS

WHERE

PRICE > 2000.00

ONION

SELECT

DISTINCT MFR, PRODUCT

FROM

ORDERS

WHERE

AMOUNT > 30000.00

4100Y

2A44L

4100Z

2A44R

775C

2A44L

2A4 4R

Обратите внимание на то, что обработка повторяющихся строк в операции 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 Тф. Вл&внные опрёцт

Результаты запроса

В 1 1

Jul ia

Harry

Mary

George

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 В



1 ... 35 36 37 [ 38 ] 39 40 41 ... 264

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