使用 UNION 运算符组合结果集
UNION 运算符使您得以将两个或多个 SELECT 语句的结果组合成一个结果集。使用 UNION 运算符组合的结果集都必须具有相同的结构。而且它们的列数必须相同,并且相应的结果集列的数据类型必须兼容。有关详细信息,请参阅 UNION 的使用准则。
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
默认情况下,SQL Server 2005 从左向右对包含 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 子句;该子句适用于最终的组合结果集。只能在各个 SELECT 语句中指定 GROUP BY 和 HAVING 子句。