UNION 的使用准则

使用 UNION 运算符时请遵循下列准则:

  • 在用 UNION 运算符组合的语句中,所有选择列表中的表达式(如列名称、算术表达式、聚合函数等)数目必须相同。

  • 用 UNION 组合的结果集中的对应列或各个查询中所使用的任何部分列都必须具有相同的数据类型,并且可以在两种数据类型之间进行隐式数据转换,或者可以提供显式转换。例如,datetime 数据类型的列和 binary 数据类型的列之间的 UNION 运算符将不执行运算,直到进行了显式转换。但是,money 数据类型的列和 int 数据类型的列之间的 UNION 运算符将执行运算,因为它们可以进行隐式转换。

    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 值,因为 floatint 的优先级高。有关详细信息,请参阅数据类型优先级 (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