Использование
предло»Сения
UNION
Глава 14. Ис11ользование 11редложения UNION
В предшествующих главах обсуждались различные варианты запросов с распо
ложением "один внутри другого". Существует другой способ комбинирования множе ства запросов - их объединение. В этой главе объясняются предложения UNION в SQL. Объединения (иnions) отличаются от подзапросов тем, что любой из двух (или большего числа) запросов не может управлять другим запросом. В объединении все запросы выполняются независимо, но их выходные данные затем объединяются.
Объединение множества запросов в один
Можно задать множество запросов одновременно и комбинировать их выходные данные с использованием предложения UNION. UNION объединяет выходные данные двух или более SQL-запросов в единое множество строк и столбцов. Для того чтобы получить сведения обо всех продавцах (sa\espeop\e) и покупателях (customers) Лондо
на в виде выходных данных одного запроса, следует ввести:
SELECT snum, sname
FROM Salespeople
WHERE city = 'London'
UNION
SELECT cnum, cname
FROM Customers
WHERE city = 'London·;
(выходные данные представлены на рис. 14,l).
Столбцы, выбранные с помощью двух команд, представлены в выходных данных так, как если бы они выбирались с помощью одного запроса. Заголовки столбцов опущены, поскольку в результат объединения входят столбцы из нескольких разных таблиц. Таким образом столбцы в выходных данных не поименованы.
Только последний запрос заканчивается точкой с запятой. Отсутствие этого знака дает возможность SQL распознать, что следует еще один запрос.
Когда можно выполнить объединение запросов?
Для того, чтобы два или более запроса можно было объединить (выполнить коман ду UNION), их столбцы, входящие в состав выходных данных, должны быть совмес тил1ы 110 объединению (иnion compatiЬ/e). Это значит, что в каждом из запросов может быть указано одинаковое количество столбцов в таком порядке: первый, второй, тре-
146
Объединение миожества за11росов в один
Рис. 14.1. Формирование объединения двух запросов
тий и т.д., - причем, первые столбцы каждого из запросов являются сравнимыми, вторые столбцы каждого из них - также сравнимы и т.д. по всем столбцам, включае мым в состав выходных данных. Значение термина "столбцы сравнимы" может ме няться. ANSI определяет его очень просто: числовые поля должны иметь полностью
совпадающие тип и размер. (В приложении В детально описаны числовые типы
ANSI.) Символьные поля должны иметь точно совпадающее количество символов (это означает, что одинаковое количество выделено, но вовсе не обязательно заполне но).
Некоторые программные продукты SQL используют более гибкие определения. Например, нестандартные с точки зрения ANSI типы, такие как DATE и BINARY, обычно сравнимы со столбцами этих же нестандартных типов. Длина столбцов тоже является проблемой. Многие программные продукты не требуют совпадения длин, но такие столбцы нельзя использовать в UNION. С другой стороны, некоторые продукты (и ANSI) требуют, чтобы длины символьных полей точно совпадали. По этим причи
нам всегда следует ознакомиться с документацией по конкретному программному
продукту.
Другое ограничение на сравнимость состоит в том, что если NULL-значения за
прещены для любого столбца в объединении, то они должны быть запрещены для всех соответствующих столбцов в других запросах объединения. NULL-значения запреща ются с помощью ограничения NOT NULL, о котором идет речь в главе 18. Нельзя ис пользовать UNION в подзапросах также, как и функции агрегирования в предложениях SELECT запросов в объединении (многие программные продукты смягчают эти ограничения).
147
Глава 14. Ис11ользование предложения U1VION
UNION и устранение дублирования
UNION автоматически исключает из выходных данных дублирующиеся строки. Не возбраняется, но и не имеет особого смысла применение в SQL оператора DISТINCT в отдельных запросах для исключения повторяющихся значений. Приме ром может служить следующий запрос, выходные данные для которого изображены
на рис. 14.2.:
SELECT snum, city
FROM Customers;
Рис. 14.2. Простой запрос с повторяющимися выходными данными
Среди них есть повторяющаяся комбинация значений (1001 с London), поскольку в запросе SQL не требуется исключать дубликаты (повторяющиеся значения). Однако, если применяется UNION для комбинации этого запроса с таким же запросом для таб лицы Salespeople, избыточная комбинация исключается. На рис. 14.3 представлены
выходные данные для следующего запроса:
SELECT snum, city
FROM Customers
UIOON
SELECT snum, city
FROM Salespeople:
Можно добиться того же (в некоторых программных продуктах SQL), указав
UNION ALL вместо UNION:
148
Объединение мноJtеества за1~росов в один
1001 London
1002 Berlin
1002 San Jose
1003 New York
1003 Rome
1004 london
101/.14 Rome
101/.17 Barcelona
1007 San Jose
Рис. 14.3. Объединение исключает повторяющиеся выходные данные
SELECT snum, city
FROM Customers
UNION ALL
SELECT snum, city
FROM Salespeople;
Использование строк и выражений с UNION
Иногда можно вставлять константы и выражения в предложения SELECT, исполь зующие UNION. Это не соответствует в точности стандарту ANSI, но часто и оправдан
но применяется. Однако применяемые константы и выражения должны при этом
удовлетворять стандарту сравнимости, о котором упоминалось ранее. Такая процедура
может оказаться полезной, например, для формулировки комментария, определяющего,
из какого конкретно запроса получена данная строка.
Предположим, необходимо сделать отчет, содержащий сведения для каждого продавца о его максимальном и минимальном заказах по каждой дате. Можно объе динить два запроса, вставив соответствующий текст в качестве комментария, для того чтобы различить каждый из двух случаев (минимальный заказ и максимальный заказ).
149