Объединение результирующих наборов с помощью оператора 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.
См. также