Оператор UNION
Объединение и опция JOIN
Внутреннее объединение
Внутреннее объединение (некоторые авторы называют его самообъединением) – объединение таблицы с этой же самой таблицей. В этом случае сравниваются значения внутри столбца одной таблицы. Например, необходимо получить список клиентов, проживающих во Владимире и имеющих одинаковые имена.
SELECT А.Код_клиента AS Код, А.Фамилия + ' ' + А.Имя AS Имя
FROM Клиент А, Клиент Б
WHERE А.Имя = Б.Имя AND А.Город = 'Владимир'
В результате получим следующее:
Код Имя
----------- -----------------------------------------
6 Владимиров Владислав
11 Шевчук Владислав
6 Владимиров Владислав
11 Шевчук Владислав
(4 row(s) affected)
Выборка содержит повторяющиеся строки. Чтобы их исключить, введем дополнительное условие.
SELECT А.Код_клиента AS Код, А.Фамилия + ' ' + А.Имя AS Имя
FROM Клиент А, Клиент Б
WHERE А.Имя = Б.Имя AND А.Город = 'Владимир'
AND А.Код_клиента <> Б.Код_клиента
Результат выборки не содержит повторяющихся строк:
Код Имя
----------- -----------------------------------------
11 Шевчук Владислав
6 Владимиров Владислав
(2 row(s) affected)
В связи с тем, что SQL Server поддерживает синтаксис ANSI-92, для объединения таблиц можно использовать опцию JOIN. В качестве примера приведем запрос, который выбирает всех клиентов, приезжавших в феврале.
SELECT Проживает.Дата_прибытия, Клиент.Фамилия
FROM Клиент INNER JOIN Проживает
ON Клиент.Код_клиента = Проживает.Код_клиента
AND MONTH(П.Дата_прибытия) = 2
AND YEAR(П.Дата_прибытия) = 2006
ORDER BY 1
Внешние объединения
Существует три типа внешнего объединения:
· Левое внешнее объединение (LEFT OUTER JOIN) – в результирующий набор включаются все строки первой (левой) таблицы.
· Правое внешнее объединение (RIGHT OUTER JOIN) – в результирующий набор включаются все строки второй (правой) таблицы.
· Полное внешнее объединение (FULL OUTER JOIN) – в результирующий набор включаются все строки как первой (левой), так и второй (правой) таблиц.
Помимо приведенного синтаксиса внешних объединений, для левого и правого объединения можно использовать следующие символы:
*= - включаются все строки левой таблицы;
=* - включаются все строки правой таблицы.
Рассмотрим примеры. Получим список номеров второго этажа гостиницы и кодов клиентов, проживающих в этих номерах в настоящее время.
SELECT Н.Номер, Н.Число_мест, П.Код_клиента, П.Дата_убытия
FROM Номер Н, Проживает П
WHERE Н.Номер *= П.Номер
AND Н.Этаж = 2
AND П.Дата_убытия > GETDATE()
Результат выборки:
Номер Число_мест Код_клиента Дата_убытия
------ ---------- ----------- ---------------------------
21 1 NULL NULL
22 2 1 2001-03-14 18:40:20.000
23 2 3 2001-03-14 18:39:31.000
24 3 NULL NULL
(4 row(s) affected)
Оператор UNION позволяет объединить результаты нескольких запросов. Он полезен, если требуется просмотреть аналогичные данные из разных таблиц. Его синтаксис:
Оператор_1 SELECT
UNION [ALL]
Оператор_2 SELECT
UNION [ALL]
…
Оператор_N SELECT
При работе с оператором UNION необходимо помнить, что он удаляет дублирующие значения. Для включения всех записей в результат выборки необходимо использовать оператор ALL сразу за оператором UNION. Все списки выборки должны совпадать по количеству, а соответствующие элементы выборок (столбцы, константы, выражения) по типу и по номеру в списке. Имена столбцов в любом случае определяются в первой команде SELECT. Если в последующих выборках не хватает столбцов, то вместо них необходимо подставить константы.