Использование UNION с ORDER В У
имеют продавцов в их городах. Очевидно, что это гораздо сложнее (выходные данные для следующего запроса представлены на рис. 14.8):
(SELECT snum, city, 'SALESPERSON - MATCHED' FROM Salespeople
WHERE city = ANY (SELECT city
FROM Customers)
UNION
SELECT snum, city, 'SALESPERSON - NO МАТСН'
FROM Salespeople WHERE NOT city = ANY
(SELECT city
FROM Customers))
UNION
(SELECT cnum, city, 'CUSTOMER - MATCHED' FROM Customers
WHERE city = ANY (SELECT city
FROM Salespeople))
UNION
SELECT cnum, city, 'CUSTOMER - NO МАТСН'
FROM Customers
WHERE NOT city = ANY (SELECT city
FROM Salespeople))
ORDER ВУ 2 DESC;
(Эта формулировка, использующая ANY, эквивалентна соединению в предыдущем примере.)
Сокращенные внешние соединения, с которых началось рассмотрение, оказывают ся полезными чаще, чем полные (рассмотрено в последнем примере). По поводу по следнего примера можно заметить: если объединение выполняется более чем для двух
155
Г.JJава 14. Использование предложеиия UNION
|
|
2553 |
San |
Jose |
CUSTOMER |
|
МдТСНЕD |
|
|
|
|
|
|
|
|||||
|
|
21'/Jl/18 San |
Jose |
CUSTOMER |
|
МдТСНЕD |
|
|
|
|
|
21!11!12 |
Rome |
|
CUSTOMER |
|
NO МдТСН |
|
|
|
|
21!11!17 |
Rome |
|
CUSTOMER |
- |
NO МдТСН |
|
|
|
|
, 1!11!13 |
New York |
SдLESPERSON |
МдТСНЕD |
|
|
||
|
|
, l!lf/13 |
New York |
SдLESPERSON |
- |
NO МдТСН |
|
|
|
|
|
21!11!11 |
London |
CUSTOMER |
|
МдТСНЕD |
|
|
|
|
|
2f/lf/16 |
london |
CUSTOMER |
|
МдТСНЕD |
|
|
|
|
|
21!11!14 |
Berlin |
CUSTOMER |
|
NO МдТСН |
|
|
|
|
|
1l!lf/17 |
Barcelona |
SдLESPERSON |
- |
МдТСНЕD |
|
|
|
|
|
, l!lf/17 |
Barcelona |
SдlESPERSON |
- |
NO МАТСН |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 14.8. Сложное внешнее соединение
запросов, то для упорядочения вычислений нужно использовать круглые скобки. Ина че говоря, вместо того, чтобы задать
query Х UNION query У UNION query Z;
необходимо конкретизировать либо
(query Х UNION query У) UNION query Z;
либо
query Х UNION (query У UNION query Z);
Это необходимо, потому что UNION и UNION ALL можно комбинировать для ис ключения одних дубликатов без устранения других. Предложение
(query Х UNION ALL query У) UNION query Z;
необязательно генерирует те же выходные данные, что и предложение
query Х UNION ALL (query У UNION query Z);
если имеются дубликаты строк, подлежащие исключению из выходных данных.
156
Итоги
Итоги
Теперь вы знаете, как использовать предложение UNION, позволяющее комбини ровать любое количество запросов в единственном теле запроса. Если есть ряд сход ных таблиц, т.е. содержащих одинаковую информацию, но принадлежащих разным пользователям и имеющих различную специфику, объединение может стать легким способом слить и упорядочить выходные данные. Внешнее соединение - это новый способ применять условия, не исключая выходные данные, а только помечая или вы
деляя их части как удовлетворяющие и неудовлетворяющие данному условию.
Этим мы заканчиваем раздел книги, посвященный запросам. Следующая тема - введение данных в таблицы и создание новых таблиц. Вы узнаете, что запросы иногда
используются не только самостоятельно, но и внутри других типов команд.
157
Работаем на SQL
1.Создайте объединение двух запросов, которые показывают значения полей
names, cities, ratings для всех покупателей (customers). Те, у кого рейтинг (rating)
200 и выше, должны иметь комментарий "High Rating", все прочие - "Low
Rating".
2.Запишите команду, которая выдает в качестве выходных данных значения полей name и number для каждого продавца и покупателя, имеющего более одного зака за. Результаты вывести в алфавитном порядке.
3.Сформируйте объединение трех запросов. Первый запрос выбирает значения поля snums для всех продавцов в San Jose. Второй запрос выбирает значения поля cnums для всех покупателей в San Jose; третий запрос выбирает значения поля onums для всех заявок за 3 октября 1990. Объединение должно сохранять дубли
каты для двух последних запросов, но исключать любую избыточность между
каждым из них (вторым и третьим) и первым.
(Замечание: в простых таблицах, используемых в примерах, такой избыточности может не оказаться, но это не изменяет сути дела.)
(Ответы см. в приложении А.)
158
15
m [UJ ш [1] ш и [1j
Ввод, удаление
и изменение
_. _.
значении полеи