UNION (Transact-SQL)
UNION (Transact-SQL)
将两个或更多查询的结果合并为单个结果集,该结果集包含联合查询中的所有查询的全部行。UNION 运算不同于使用联接合并两个表中的列的运算。
下面列出了使用 UNION 合并两个查询结果集的基本规则:
所有查询中的列数和列的顺序必须相同。
数据类型必须兼容。
Transact-SQL 语法约定
语法
{ <query specification> | ( <query expression> ) }
UNION [ ALL ]
<query specification | ( <query expression> )
[ UNION [ ALL ] <query specification> | ( <query expression> )
[ ...n ] ]
参数
<query_specification> | ( <query_expression> )
查询规范或查询表达式,用以返回与另一个查询规范或查询表达式所返回的数据合并的数据。作为 UNION 运算一部分的列定义可以不相同,但它们必须通过隐式转换实现兼容。如果数据类型不同,则根据数据类型优先顺序规则确定所产生的数据类型。如果类型相同,但精度、小数位数或长度不同,则根据用于合并表达式的相同规则来确定结果。有关详细信息,请参阅 精度、小数位数和长度 (Transact-SQL)。
xml 数据类型的列必须等价。所有列必须类型化为 XML 架构或是非类型化的。如果要类型化,这些列必须类型化为相同的 XML 架构集合。
UNION
指定合并多个结果集并将其作为单个结果集返回。
ALL
将全部行并入结果中。其中包括重复行。如果未指定该参数,则删除重复行。
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 值,因为 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
将两个或更多查询的结果合并为单个结果集,该结果集包含联合查询中的所有查询的全部行。UNION 运算不同于使用联接合并两个表中的列的运算。
下面列出了使用 UNION 合并两个查询结果集的基本规则:
所有查询中的列数和列的顺序必须相同。
数据类型必须兼容。
Transact-SQL 语法约定
语法
{ <query specification> | ( <query expression> ) }
UNION [ ALL ]
<query specification | ( <query expression> )
[ UNION [ ALL ] <query specification> | ( <query expression> )
[ ...n ] ]
参数
<query_specification> | ( <query_expression> )
查询规范或查询表达式,用以返回与另一个查询规范或查询表达式所返回的数据合并的数据。作为 UNION 运算一部分的列定义可以不相同,但它们必须通过隐式转换实现兼容。如果数据类型不同,则根据数据类型优先顺序规则确定所产生的数据类型。如果类型相同,但精度、小数位数或长度不同,则根据用于合并表达式的相同规则来确定结果。有关详细信息,请参阅 精度、小数位数和长度 (Transact-SQL)。
xml 数据类型的列必须等价。所有列必须类型化为 XML 架构或是非类型化的。如果要类型化,这些列必须类型化为相同的 XML 架构集合。
UNION
指定合并多个结果集并将其作为单个结果集返回。
ALL
将全部行并入结果中。其中包括重复行。如果未指定该参数,则删除重复行。
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 值,因为 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