Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 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

Источник: https://studfile.net/preview/16418473/