Объединение результирующих наборов с помощью оператора UNION

Оператор UNION позволяет объединять результаты нескольких инструкций SELECT в один результирующий набор. У результирующих наборов, объединяемых с помощью оператора UNION, должна быть одинаковая структура. Они должны содержать одинаковое количество столбцов, а в соответствующих столбцах результирующих наборов должны быть совместимые типы данных. Дополнительные сведения см. в разделе Правила использования оператора UNION.

Оператор UNION задается следующим образом:

select_statement UNION [ALL] select_statement

Например, таблицы Table1 и Table2 имеют одинаковую структуру — содержат по два столбца.

TABLE1

TABLE2

COLUMNA

COLUMNB

COLUMNC

COLUMND

CHAR(4)

INT

CHAR(4)

INT

-------

---

-------

---

ABC

1

GHI

3

DEF

2

JKL

4

GHI

3

MNO

5

Этот запрос объединяет таблицы с помощью оператора UNION:

SELECT * FROM Table1
UNION
SELECT * FROM Table2

Ниже приведен результирующий набор:

ColumnA  ColumnB
-------  --------
abc      1
def      2
ghi      3
jkl      4
mno      5

Имена столбцов результирующего набора UNION совпадают с именами столбцов в результирующем наборе первой инструкции SELECT в операторе UNION. Имена столбцов результирующих наборов прочих инструкций SELECT не обрабатываются.

По умолчанию оператор UNION удаляет повторяющиеся строки из результирующего набора. Если указан параметр ALL, то результат будет содержать все строки, и повторяющиеся строки не будут удалены.

Точный результат оператора UNION зависит от параметра сортировки, выбранного во время установки, а также от предложения ORDER BY. Дополнительные сведения о влиянии различных параметров сортировки см. в разделе Работа с параметрами сортировки.

В инструкции Transact-SQL может быть любое количество операторов UNION. Например:

SELECT * FROM TableA
UNION
SELECT * FROM TableB
UNION
SELECT * FROM TableC
UNION
SELECT * FROM TableD

По умолчанию SQL Server 2005 вычисляет инструкцию с операторами UNION слева направо. Порядок вычисления задается с помощью скобок. Например, следующие инструкции не эквивалентны:

/* First statement. */
SELECT * FROM TableA
UNION ALL
(   SELECT * FROM TableB
   UNION
   SELECT * FROM TableC
)
GO

/* Second statement. */
(SELECT * FROM TableA
 UNION ALL
 SELECT * FROM TableB
)
UNION
SELECT * FROM TableC)
GO

Примечания

В первой инструкции повторы в объединении TableB и TableC удаляются. В объединении этого набора с TableA повторы не удаляются. Во второй инструкции повторы включены в объединение TableA и TableB, но устраняются при последующем объединении с TableC. В этом выражении параметр ALL влияет на окончательный результат.

При использовании оператора UNION в отдельных инструкциях SELECT не может быть собственных предложений ORDER BY или COMPUTE. После последней инструкции SELECT может быть только одно предложение ORDER BY или COMPUTE. Оно применяется к окончательному, объединенному результирующему набору. Предложения GROUP BY и HAVING могут быть заданы только в отдельных инструкциях SELECT.