将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行。这与使用联接组合两个表中的列不同。
使用 UNION 组合两个查询的结果集的两个基本规则是:
- 所有查询中的列数和列的顺序必须相同。
- 数据类型必须兼容。
语法
{ < query specification > | ( < query expression > ) }
UNION [ ALL ]
< query specification | ( < query expression > )
[ UNION [ ALL ] < query specification | ( < query expression > )
[ ...n ] ]
参数
< query_specification > | ( < query_expression > )
是查询规范或查询表达式,用以返回与另一个查询规范或查询表达式所返回的数据组合的数据。作为 UNION 运算一部分的列定义可以不相同,但它们必须通过隐性转换实现兼容。
下表说明数据类型与相应 (ith) 列的选项的比较规则。
ith 列的数据类型 | 结果表中 ith 列的数据类型 |
---|---|
非数据兼容类型(数据转换不由 Microsoft® SQL Server™ 隐性处理)。 | SQL Server 返回的错误。 |
长度为 L1 和 L2 的固定长度 char。 | 长度与 L1 和 L2 中较长的那个相等的固定长度 char。 |
长度为 L1 和 L2 的固定长度 binary。 | 长度与 L1 和 L2 中较长的那个相等的固定长度 binary。 |
任一列或两列都是可变长度 char。 | 长度与为 ith 列指定的最大长度相等的可变长度 char。 |
任一列或两列都是可变长度 binary。 | 长度与为 ith 列指定的最大长度相等的可变长度 binary。 |
两列都是数字数据类型(如 smallint、int、float、money)。 | 与两列的最大精度相等的数据类型。例如,如果表 A 的 ith 列是 int 类型,表 B 的 ith 列是 float 类型,则 ith 列在结果表中的数据类型是 float,因为 float 比 int 更精确。 |
两列的描述都指定 NOT NULL。 | 指定 NOT NULL。 |
UNION
指定组合多个结果集并将其作为单个结果集返回。
ALL
在结果中包含所有的行,包括重复行。如果没有指定,则删除重复行。
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 的结果集列名与 UNION 运算符中第一个 SELECT 语句的结果集中的列名相同。另一个 SELECT 语句的结果集列名将被忽略。
默认情况下,UNION 运算符从结果集中删除重复的行。如果使用 ALL 关键字,那么结果中将包含所有行并且将不删除重复的行。
UNION 运算的准确结果取决于安装过程中选择的排序规则和 ORDER BY 子句。
Transact-SQL 语句中可以出现任意数目的 UNION 运算符,例如:
SELECT * FROM TableA UNION SELECT * FROM TableB UNION SELECT * FROM TableC UNION SELECT * FROM TableD
默认情况下,Microsoft® SQL Server™ 2000 从左到右对包含 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 语句中指定。