Глава 14. Использоваиие предло.жеиия UNION
SELECT a.snum, sname, onum, 'Highest оп·, odate FROM Salespeople а, Orders Ь
WHERE a.snum b.snum AND b.amt =
(SELECT МАХ (amt) FROM Orders с
WHERE c.odate b.date)
UNION
SELECT a.snum, sname, onum, 'Lowest оп·, odate FROM Salespeople а, Orders Ь
WHERE a.snum b.snum AND b.amt =
(SELECT MIN (amt) FROM Orders с
WHERE c.odate = b.odate);
Выходные данные для этих команд представлены на рис. 14.4.
Необходимо добавить дополнительный пробел в строку 'Lowest on', для того чтобы длина этой строки соответствовала длине строки 'Highest on'. Рее! выбран дважды, как имеющий максимальный и минимальный заказы на 5 октября 1990 г., хотя достаточно
Peel |
3f/Jf/J8 |
Highest |
Peel |
301/JB |
Lowest |
Peel |
3f/J11 |
Highest |
Serres |
3f/Jf/J5 |
Highest |
Serres |
3f/J87 |
Lowest |
Serres |
3!1J1 f/J |
Lowest |
Axelrod |
3f/Jf/J9 |
Highest |
Rifkiп |
3f/Jf/J1 |
Lowest |
оп
оп
оп
оп
оп
оп
оп
оп
10,f/J5,199&
10/85/199"
1f/J/f/J6/199f/J
11/J/83/1991/J
1f/J/04/199f/J
1f/J/f/J6/199f/J
1f/J/f/J4/199f/J
1f/J/f/J3/199f/J
----i3rO'vJSC 't.J.+--;
Рис. 14.4. Выбор наибольшей (highest) и наименьшей (lowest) заявок с поясняющими строками
текста
150
Исllользование UNJON с ORDER ВУ
было бы выбрать его один раз. Это произошло потому, что вставляемые строки для
двух запросов различны, следовательно, строки выходных данных не удаляются авто
матически как дублирующиеся.
Использование UNION с ORDER ВУ
До сих пор мы не придавали значения порядку представления данных множества за
просов в выходных данных. Сначала представлялись выходные данные для первого за проса, затем - для второго. Нельзя считать, что данные автоматически будут следовать именно в таком порядке. Этот способ расположения (представления) выходных данных выбран исключительно для более простого восприятия результатов выполнения коман
ды. Однако, предложение ORDER ВУ применяется и для упорядочения выходных дан
ных объединения, так же как это делалось для отдельных (индивидуальных) запросов. Можно пересмотреть последний пример, предположив необходимость упорядочения выходных данных запроса. В этом случае станет ясно, почему, например, имя Рее! в вы
ходных данных предыдущего запроса многократно повторялось:
SELECT a.snum, sname, onum, 'Highest оп', odate
FROM Salespeople а, Orders Ь
WHERE a.snum = b.snum
AND b.amt =
(SELECT МАХ (amt)
FROM Orders с
|
R1fk1п |
Lowest |
оп |
|
|
Serres |
Highest |
оп |
|
|
Serres |
Lowest |
оп |
|
|
Peel |
Highest |
оп |
|
|
Peel |
Lowest |
оп |
|
|
Axelrod |
Highest |
on |
|
|
Serres |
Lowest |
on |
|
|
Peel |
Highest |
оп |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 14.5. Формирование объединения с использованием ORDER ВУ
151
Глава 14. Использова11ие предложе11ия UNION
WHERE c.odate b.odate)
UNION
SELECT a.snum, sname, onum, 'Lowest on', odate
FROM Salespeople а, Orders Ь
WHERE a.snum = b.snum
AND b.amt =
(SELECT MIN (amt)
FROM Orders с
WHERE c.odate = b.odate)
ORDER ВУ З;
Выходные данные для этого запроса представлены на рис. 14.5.
Поскольку способ упорядочения по возрастанию (ASC) для ORDER ВУ принят по
умолчанию, он специально не указывается. Можно упорядочить выходные данные в соответствии со значениями нескольких полей: для каждого из полей независимо по
возрастанию или убыванию (ASC или DESC), как это делалось для выходных данных одного запроса. Число 3 в предложении ORDER ВУ задает номер столбца в упорядо ченном списке предложения SELECT. Поскольку столбцы выходных данных, полу ченных в результате выполнения объединения, являются непоименованными, на столбец можно сослаться только по номеру, определяющему его место расположения среди столбцов выходных данных.
Внешнее соединение
Часто бывает полезна операция объединения двух запросов, в которой второй за прос выбирает строки, исключенные первым. Обычно это приходится делать для ис
ключения строк, не удовлетворяющих предикату при выполнении операции
соединения таблиц. Это называется в11ештш.м соеди11е//uе.м (outer join). Предположим, у некоторых из покупателей еще нет продавцов. Можно посмотреть имена и города всех покупателей с указанием имен их продавцов, не отбрасывая покупателей, еще не имеющих продавцов. Можно получить желаемые сведения, сформировав объедине ние двух запросов, один из которых выполняет объединение, а второй выбирает поку пателей с NULL-значением в поле snum. Последний может вставлять пробелы в поле,
соответствующее полю sпame первого запроса.
Для идентификации запроса, с помощью которого получена данная строка, можно вставлять строки текста в выходные данные. Использование этой возможности во внешнем соединении позволяет применять предикаты для классификации выходных
данных, а не для их исключения.
152
Использование UNION с ORDER В У
|
Serres |
Cisneros |
|
|
|
||
|
Serres |
liu |
|
|
Rifkin |
NO МАТСН |
|
|
Peel |
Clemens |
|
|
Peel |
Hoffman |
|
|
Motika |
Clemens |
|
|
Motika |
Hof fman |
|
|
Axelrod |
NO МАТСН |
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 14.6. Внешнее соединение
Пример поиска продавцов (salespeople) с покупателями (customers), расположен ными в тех же городах, рассматривался ранее. Теперь необходимо в составе выходных
данных увидеть список всех продавцов и пометить тех , кто не имеет покупателей, на
ходящихся в их городе (city), так же как и тех, кто таких покупателей имеет. Следую щий запрос, выходные данные для которого представлены на рис. 14.6, позволяет
сделать это:
SELECT Salespeople.snum, sname, cname, comm
FROM Salespeople, |
Customers |
|
WHERE Salespeople.city = Customers.city |
||
UNION |
|
|
SELECT snum, sname, |
. NO МАТСН |
, comm |
FROM Salespeople |
|
|
WHERE NOT city = ANY (SELECT city
FROM Customers)
ORDER ВУ 2 DESC;
Строка 'NO МАТСН' дополнена пробелами так, чтобы она соответствовала полю сnаше по длине (практически в этом нет необходимости для всех программных реали заций SQL). Второй запрос выбирает строки, не соответствующие предикату первого
запроса.
153
Глава 14. Использование предложения UNION
В запрос можно добавить комментарий или выражение в качестве дополнительно го поля. Для этого необходимо включить некоторый совместимый комментарий или выражение в соответствующую позицию списка имен полей предложения SELECT для каждого запроса в операторе объединения. Сравнимость по объединению предот вращает ситуации, когда дополнительное поле добавляется к одному из запросов, но не добавляется к другому. Вот пример запроса, который добавляет строки к выбран ным полям. Текст этих строк сообщает о наличии для данного продавца назначенного ему покупателя из его же города ('MATCHED' - 'NO МАТСН'):
SELECT a.snum, sname, a.city, 'MATCHED' FROM Salespeople а, Customers Ь WHERE a.city = b.city
UNION
SELECT snum, sname, city, 'NO МАТСН FROM Salespeople
WHERE NOT city =ANY (SELECT city
FROM Customers) ORDERD ВУ 2 DESC;
Выходные данные для этого запроса представлены на рис. 14.7.
Это неполное внешнее соединение, поскольку оно включает только не назначен
ные (unmatched) поля для одной из участвующих в соединении таблиц. Полное внеш
нее соединение должно включать всех покупателей, которые как имеют, так и не
|
Serres |
San Jose |
|
|
Rifkin |
Barcelona |
|
|
Peel |
London |
|
|
Motika |
London |
|
|
Axelrod |
New York |
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 14. 7. Внешнее соединение с полями комментария
154