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)