Intersect

EXCEPT

EXCEPT

UNION

UNION

SELECT AName, SUM(Qty) AS "Common quantity",

SUM(Qty * Price) AS "Common pay"

FROM ARTICLE A INNER JOIN INVOICE I ON A.ACode = I.ACode

WHERE WId = 'W02'

GROUP BY AName

2. Вернемся к примеру F7: для всех поставщиков, поставляющих и не поставляющих товары, получить отчет в виде: имя поставщика, название товара, общее количество поставленного товара, суммарная стоимость поставок. Данный запрос может быть реализован еще и с помощью операции объединения –

2.UNION. Запрос 1 в данном примере будет возвращать информацию о поставщиках, поставляющих товары (в соответствии с примером F4), а запрос 2 – информацию о поставщиках, не поставляющих товары (в соответствии с примером E3), при этом вместо названия товара будет возвращена пустая строка, а вместо количества и стоимости поставок – нули. Запрос будет иметь следующий вид:

SELECT SName, AName, SUM(Qty) AS "Common quantity",

SUM(Qty * Price) AS "Common pay"

FROM SALOR S INNER JOIN INVOICE I ON S.SId = I.SId

INNER JOIN ARTICLE A ON I.ACode = A.ACode

GROUP BY SName, AName

SELECT SName, ' ' AS AName, 0 AS "Common quantity", 0 AS "Common pay"

FROM SALOR

WHERE SId NOT IN (SELECT SId FROM INVOICE)

3. Вернемся к примеру E4. Получить отчет в виде: название товара, стоимость единицы товара, номер поставщика, количество поставленного товара для товаров, поставляемых только на базу с номером W01.

Требуемый отчет можно получить по следующей схеме: выделить товары, поставляемые на базу W01, за исключением (EXCEPT) тех, которые поставляют на другие базы. Запрос будет выглядеть следующим образом:

SELECT AName, Price, Sid, Qty

FROM ARTICLE A INNER JOIN INVOICE I ON A.ACode = I.ACode

WHERE WId = 'W01' -- информация о товарах, поставляемых на базу W01

SELECT AName, Price, Sid, Qty

FROM ARTICLE A INNER JOIN INVOICE I ON A.ACode = I.ACode

WHERE WId <> 'W01' -- информация о товарах, поставляемых на другие базы

4. Вернемся к примеру E5. Получить все пары код товара – номер торговой базы такие, что данный товар не поставляется на данную базу.

Требуемый отчет можно получить по следующей схеме: получить все пары код товара – номер торговой базы (с помощью запроса, реализующего Декартово произведение таблиц ARTICLE и WAREHOUSE), за исключением тех, которые встречаются в таблице INVOICE:

SELECT ACode, WId FROM ARTICLE, WAREHOUSE

SELECT ACode, WId FROM INVOICE

5. Получить названия и стоимость тех товаров, поставляемых на базу с номером W01, которые поставляются поставщиком S01 на базу W03.

SELECT AName, Price

FROM ARTICLE A, INVOICE I

WHERE A.ACode = I.ACode AND WId = 'W01'

SELECT AName, Price

FROM ARTICLE A, INVOICE I

WHERE A.ACode = I.ACode AND WId = 'W03' AND SId = 'S01'

В данном примере соединение таблиц с таким же успехом может быть реализовано с помощью операции INNER JOIN.

H. Использование представлений и вложенных табличных выражений

1. Получить имена поставщиков, поставляющих максимальное суммарное количество товаров.

В примере F13 были получены имена первых трех поставщиков, поставляющих максимальное количество товаров. Если несколько, например, 5 поставщиков поставляют одинаковое максимальное количество товара, то приведенный в примере запрос выведет имена только трех из них, выбранных произвольным образом. Чтобы получить имена всех поставщиков, надо суммарное количество товара, т.е. SUM(Qty), сравнивать с максимальной суммой, т.е. MAX(SUM(Qty)). Непосредственно такая запись невозможна; необходимо сначала сформировать некоторую промежуточную таблицу, содержащую, например, номера поставщиков и суммарное количество поставляемых ими товаров, а потом с помощью этой таблицы получить ответ на поставленный вопрос.

Такая задача может быть решена с помощью представления.

Сначала создадим представление, например, с именем V1:

CREATE VIEW V1(SId, Qty)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: