Поделиться через


Правила использования оператора 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