Правила использования оператора UNION
При использовании операторов UNION следует придерживаться таких правил:
Все списки выборки в инструкциях, комбинируемые с помощью оператора UNION, должны содержать одинаковое число выражений (имен столбцов, арифметических выражений, статистических функций и т. д.).
Соответствующие столбцы в результирующих наборах, комбинируемых оператором UNION, так же как и любой поднабор столбцов, используемых в отдельных запросах, должны принадлежать к одному и тому же типу данных, обладать возможностью неявного преобразования данных между двумя типами или поддерживать явное преобразование. Например, операция UNION между столбцами данных, один из которых принадлежит к типу datetime, а другой — к типу binary, работать не будет, если только не задано явное преобразование. Однако операция UNION между столбцами, принадлежащими к типам данных money и int, работать будет, так как они могут быть преобразованы неявно.
Столбцы типа данных xml должны быть эквивалентны друг другу. Все столбцы должны быть либо типизированными для XML-схемы, либо нетипизированными. Типизированные столбцы должны относиться к одной и той же коллекции XML-схем.
Соответствующие столбцы результирующего набора в отдельных инструкциях, комбинируемые оператором UNION, должны указываться в одном и том же порядке, так как оператор UNION сравнивает столбцы один к одному в порядке, указанном в отдельных запросах.
Ниже приведен пример.
TABLE3
TABLE4
A
B
C
A
B
INT
CHAR(4)
CHAR(4)
CHAR(4)
FLOAT
---
-------
-------
-------
-------
1
ABC
JKL
JKL
1.000
2
DEF
MNO
MNO
5.000
3
GHI
PQR
Выполните следующий запрос:
SELECT a, b FROM table3 UNION SELECT b, a FROM table4Результирующий набор:
a b -------- ----- 1.000000 abc 2.000000 def 3.000000 ghi 1.000000 jkl 5.000000 mnoПри объединении различных типов данных в операции UNION эти типы преобразуются согласно правилам приоритета типов данных. В предыдущем примере значения типа int преобразовались в тип float, так как тип float имеет более высокий приоритет, чем тип int. Дополнительные сведения см. в разделе Приоритет типов данных (Transact-SQL).
Результатом этого запроса является сообщение об ошибке, так как типы данных соответствующих столбцов несовместимы:
SELECT b, c FROM table3 UNION SELECT a, b FROM table4Имена столбцов в таблице, полученной в результате операции UNION, взяты из первого отдельного запроса инструкции UNION. Обращение к столбцу результирующего набора по новому имени (например в предложении ORDER BY) должно производиться таким же образом, как и в первой инструкции SELECT:
SELECT city AS Cities FROM stores_west UNION SELECT city FROM stores_east ORDER BY city