Раздел объединения запросов в SQL


Виды объединений запросов:

1) UNION

<запрос1> UNION [ALL|DISTINCT] <запрос2>


Запросы выполняются независимо, затем выходные множества складываются с удалением или без дубликатов строк.

Примечания по разделу UNION:
Для объединения двух или более запросов необходимо:
• Чтобы столбцы, входящие в состав обоих запросов, были совместимы по объединению. Это значит, что в каждом из запросов должно быть указано одинаковое число столбцов, причем столбцы на одинаковых позициях должны быть одного типа и одинакового размера (имена столбцов могут различаться).
• Запросы не должны быть отсортированы с помощью ORDER BY, но можно отсортировать итоговое множество, для чего следует в конце второго запроса использовать конструкцию

ORDER BY <номера выходных столбцов>

Особенности объединения запросов UNION:
• Запрещено использование выражений в списке возвращаемых столбцов, а также включение разделов GROUP BY и HAVING, однако использование констант разрешено.
• Имена выходных столбцов соответствуют именам столбцов первого запроса.
ALL заставляет включить в результат и дубликаты строк.
DISTINCT заставляет удалять дубликаты строк. Действует по умолчанию. NULL-значения считаются дублирующими.
• Объединение UNION можно использовать многократно.

SELECT * FROM A UNION (SELECT * FROM B UNION SELECT * FROM C)

Пример объединения запросов UNION:

SELECT SNum, SName FROM SalesPeople WHERE City=’London’ UNION SELECT CNum, CName FROM Customer WHERE City=’London’
SELECT A.SNum, SName, ONum, ‘Наибольший заказ = ’, ODate FROM SalesPeople A, Orders B WHERE A.SNum=B.SNum AND B.Amt=(SELECT MAX(Amt) FROM Orders C WHERE C.ODate=B.ODate)
UNION
SELECT A.SNum, SName, ONum, ‘Наибольший заказ = ’, ODate FROM SalesPeople A, Orders B WHERE A.SNum=B.SNum AND B.Amt=(SELECT MIN(Amt) FROM Orders C WHERE C.ODate=B.ODate) ORDER BY 4,5
//Возвращает номера и имена продавцов, а также номер и дату наибольшего и наименьшего заказа за день и сортирует данные по константе-подписи и дате заказа.

SELECT SalesPeople.SNum, SName, CName, Comm FROM SalesPeople, Customer WHERE SalesPeople.City=Customer.City
UNION
SELECT SNum, SName, ‘Не имеет покупателей’, Comm FROM SalesPeople WHERE NOT City=ANY(SELECT City FROM Customer) ORDER BY 2 DESC
//Возвращает номера и имена продавцов и их покупателей из одного города и комиссионные, а также номера и имена продавцов, не имеющих покупателей, и сортирует данные по убыванию имени продавца.

Примечание:
Число символов константе ‘Не имеет покупателей’ не должно превышать число символов в колонке CName.

2) INERSECT

<запрос1> INERSECT [ALL|DISTINCT] [CORRESPONDING [BY(<список столбцов>)]] <запрос2>

Примечания по разделу INTERSECT:
• Запросы выполняются независимо, затем находятся общие строки с удалением или без удаления дубликатов. Похож на объединение запросов INNER JOIN.
ALL заставляет включить в результат и дубликаты строк.
DISTINCT заставляет удалять дубликаты строк. Действует по умолчанию. NULL-значения считаются дублирующими.
CORRESPONDING заставляет выводить только одноименные столбцы.
BY заставляет выводить только указанные столбцы.
• Oracle, DB2, SQL Server поддерживают с ограничениями.

3) EXCEPT

<запрос1>|VALUES <конструктор значение таблицы> EXCEPT [ALL|DISTINCT] [CORRESPONDING [BY(<список столбцов>)]] <запрос2>|VALUES <конструктор значений таблицы>

Примечания по разделу EXCEPT:
• Запросы или наборы таблиц выполняются независимо, затем из результата первого запроса вычитаются все строки второго запроса с удалением или нет дубликатов.
DISTINCT заставляет удалять дубликаты строк. Действует по умолчанию. NULL-значения считаются дублирующими.
CORRESPONDING заставляет выводить только одноименные столбцы.
• В Oracle вместо EXCEPT используется ключевое слово MINUS.


Комментарии запрещены.

Взаимная помощь в конкурсах голосование в России


Статистика