Вы можете, использовать предложение ORDER BY чтобы упорядочить вывод из объединения, точно так же как это делается в индивидуальных запросах. Давайте пересмотрим наш последний пример чтобы упорядочить имена с помощью их порядковых номеров. Это может внести противоречие, такое как повторение имени Peel в последней команде, как вы сможете увидеть из вывода показанного в Таблице 14.5.
SELECT a.snum, sname, onum, 'Highest on', 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, 'Lowest on', odat
FROM Salespeople a, Orders b
WHEREa.snum=b.snum
AND b.amt=
( SELECT MIN (amt)
FROM Orders c
WHERE c.odate=b.odate )
ORDER BY 3;
SQL Execution Log
SELECT min (amt) FROM Orders c
WHERE c.odate=b.odate) ORDER BY 3;
1007
|
Rifkin
|
3001
|
Lowest on
|
10/03/1990
|
1002
|
Serres
|
3005
|
Highest on
|
10/03/1990
|
1002
|
Serres
|
3007
|
Lowest on
|
10/04/1990
|
1001
|
Peel
|
3008
|
Highest on
|
10/05/1990
|
1001
|
Peel
|
3008
|
Lowest on
|
10/05/1990
|
1003
|
Axelrod
|
3009
|
Highest on
|
10/04/1990
|
1002
|
Serres
|
3010
|
Lowest on
|
10/06/1990
|
1001
|
Peel
|
3011
|
Highest on
|
10/06/1990
|
Таблица 14.5: Формирование объединения с использованием ORDER BY
Пока ORDER BY используется по умолчанию, мы не должны его указывать.
Мы можем упорядочить наш вывод с помощью нескольких полей, одно внутри другого и указать ASC или DESC для каждого, точно также как мы делали это для одиночных запросов. Заметьте, что номер 3 в предложении ORDER BY указывает какой столбец из предложения SELECT будет упорядочен. Так как столбцы объединения - это столбцы вывода, они не имеют имен, и следовательно, должны определяться по номеру. Этот номер указывает на их место среди других столбцов вывода. (Смотрите Главу 7, обсуждающую столбцы вывода.)
ВНЕШНЕЕ ОБЪЕДИНЕНИЕ
Операция которая бывает часто полезна - это объединение из двух запросов в котором второй запрос выбирает строки, исключенные первым. Наиболее часто, вы будете делать это, так чтобы не исключать строки которые не удовлетворили предикату при объединении таблиц. Это называется - внешним обьединением. Предположим что некоторые из ваших заказчиков еще не были назначены к продавцам. Вы можете захотеть увидеть имена и города всех ваших заказчиков, с именами их продавцов, не учитывая тех кто еще не был назначен. Вы можете достичь этого, формируя объединение из двух запросов, один из которых выполняет обьединение, а другой выбирает заказчиков с пустыми(NULL) значениями поля snum. Этот последний запрос должен вставлять пробелы в поля соответствующие полю sname в первом запросе. Как и раньше, вы можете вставлять текстовые строки в ваш вывод чтобы идентифицировать запрос который вывел данную строку. Использование этой методики во внешнем обьединении, дает возможность использовать предикаты для классификации, а не для исключения.
Мы использовали пример нахождения продавцов с заказчиками размещенными в их городах и раньше. Однако вместо просто выбора только этих строк, вы возможно захотите чтобы ваш вывод перечислял всех продавцов, и указывал тех, кто не имел заказчиков в их городах, и кто имел. Следующий запрос, чей вывод показывается в Таблице 14.6, выполнит это:
SELECT Salespeople.snum, sname, cname, comm
FROM (Salespeople, Customers
WHERE Salespeople.city=Customers.city.
UNION
SELECT snum, sname, ' NO MATCH ', comm
FROM (Salespeople
WHERE NOT city=ANY
( SELECT city
FROM Customers )
ORDER BY 2 DESC;
SQL Execution Log
FROM Salespeople WHERE NOT city=ANYate)
( SELECT city FROM Customers) ORDER BY 2 DESC;
1002
|
Serres
|
Cisneros
|
0.1300
|
1002
|
Serres
|
Liu
|
0.1300
|
1007
|
Rifkin
|
NO MATCH
|
0.1500
|
1001
|
Peel
|
Clemens
|
0.1200
|
1001
|
Peel
|
Hoffman
|
0.1200
|
1004
|
Motika
|
Clemens
|
0.1100
|
1004
|
Motika
|
Hoffman
|
0.1100
|
1003
|
Axelrod
|
NO MATCH
|
0.1000
|
Таблица 14. 6: Внешнее обьединение
Строка 'NO MATCH' была дополнена пробелами, чтобы получить совпадение поля cname по длине (это не обязательно во всех реализациях SQL). Второй запрос выбирает даже те строки которые исключил первый. Вы можете также добавить комментарий или выражение к вашему запросу, ввиде дополнительного поля. Если вы сделаете это, вы будете должны добавить некоторый дополнительный комментарий или выражение, в той же самой позиции среди выбранных полей, для каждого запроса в операции объединения. Совместимость UNION предотвращает вас от добавления дополнительного поля для первого запроса, но не для второго. Имеется запрос который добавляет строки к выбранным полям, и указывает совпадает ли данный продавец с его заказчиком в его городе:
Читать дальше