学习SQLSERVER的资料:http://www.fzs8.net/database/2007-07-03/7601.html
与其它 Transact-SQL 语句一起使用 UNION 语句
与其它 Transact-SQL 语句一起使用 UNION 语句时,请遵循以下指南:
- UNION 语句中的第一个查询可以包含一个 INTO 子句,该子句用来创建容纳最终结果集的表。只有第一个查询可以使用 INTO 子句。如果该子句出现在别处,Microsoft® SQL Server™ 2000 将显示错误信息。此外请记住:如果没有设置 select into/bulkcopy 选项,那么 SELECT INTO 子句只能创建临时表。
- 只有在 UNION 语句的结尾,才允许使用 ORDER BY 和 COMPUTE 子句以定义最终结果的顺序或计算汇总值。不能在组建 UNION 语句的单独查询中使用这些子句。
- GROUP BY 和 HAVING 子句只能在单独的查询中使用;它们不能用来影响最终的结果集。
- UNION 运算符可用于 INSERT 语句中。
- FOR BROWSE 子句不能在包含 UNION 运算符的语句中使用。
UNION 运算符使用准则
使用 UNION 运算符时请遵循以下准则:
- 在使用 UNION 运算符组合的语句中,所有选择列表的表达式数目必须相同(列名、算术表达式、聚合函数等)。
- 在使用 UNION 组合的结果集中的相应列、或个别查询中使用的任意列的子集必须具有相同数据类型,并且两种数据类型之间必须存在可能的隐性数据转换,或提供了显式转换。例如,在 datetime 数据类型的列和 binary 数据类型的列之间不可能存在 UNION 运算符,除非提供了显式转换,而在 money 数据类型的列和 int 数据类型的列之间可以存在 UNION 运算符,因为它们可以进行隐性转换。
- 用 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 table3UNION SELECT b, a FROM table4
下面是结果集:
a b-------- -----1.000000 abc2.000000 def3.000000 ghi1.000000 jkl5.000000 mno
在 UNION 操作中组合不同的数据类型时,这些数据类型将使用数据类型优先级的规则进行转换。在前面的示例中,int 值转换成 float 值,因为 float 类型的优先权比 int 类型高。有关更多信息,请参见数据类型的优先顺序。
以下查询将产生错误信息,因为相应列的数据类型不兼容:
SELECT b, c FROM table3UNION SELECT a, b FROM table4
- 通过 UNION 生成的表中的列名来自 UNION 语句中的第一个单独的查询。若要用新名称引用结果集中的某列(例如在 ORDER BY 子句中),必须按第一个 SELECT 语句中的方式引用该列:
SELECT city AS Cities FROM stores_westUNION SELECT city FROM stores_eastORDER BY city
使用 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 Table1UNIONSELECT * FROM Table2
下面是结果集:
ColumnA ColumnB------- --------abc 1def 2ghi 3jkl 4mno 5
UNION 的结果集列名与 UNION 运算符中第一个 SELECT 语句的结果集中的列名相同。另一个 SELECT 语句的结果集列名将被忽略。
默认情况下,UNION 运算符从结果集中删除重复的行。如果使用 ALL 关键字,那么结果中将包含所有行并且将不删除重复的行。
UNION 运算的准确结果取决于安装过程中选择的排序规则和 ORDER BY 子句。有关不同排序规则的效果的更多信息,请参见 SQL Server 排序规则基础知识。
Transact-SQL 语句中可以出现任意数目的 UNION 运算符,例如:
SELECT * FROM TableAUNIONSELECT * FROM TableBUNIONSELECT * FROM TableCUNIONSELECT * FROM TableD
默认情况下,Microsoft® SQL Server™ 2000 从左到右对包含 UNION 运算符的语句进行取值。使用圆括号指定求值的顺序。例如,以下语句并不等价:
/* First statement. */SELECT * FROM TableAUNION ALL( SELECT * FROM TableB UNION SELECT * FROM TableC)GO/* Second statement. */(SELECT * FROM TableA UNION ALL SELECT * FROM TableB)UNIONSELECT * FROM TableC)GO
在第一个语句中,将消除 TableB 和 TableC 之间的联合中的重复行。而在该集与 TableA 之间的并集中,不消除重复行。在第二个语句中,TableA 和 TableB 之间的联合中包含重复行,但在随后与 TableC 的联合中将消除。ALL 关键字对此表达式的最终结果没有影响。
如果使用 UNION 运算符,那么单独的 SELECT 语句不能包含其自己的 ORDER BY 或 COMPUTE 子句。只能在最后一个 SELECT 语句的后面使用一个 ORDER BY 或 COMPUTE 子句;该子句适用于最终的组合结果集。GROUP BY 和 HAVING 子句只能在单独的 SELECT 语句中指定。
在ORACLE中:
--语法正确,并且排序也正确。
select * from (select * from emp where deptno=30 order by empno desc)
union all
select * from (select * from emp where deptno=30 order by empno)
--语法错误
select * from emp where deptno=30
union all
select * from emp where deptno=30 order by empno
在SQLSERVER2000中:
--语法正确,但是排序不正确
select * from (select * from emp where deptno=30 order by empno desc) a
union all
select * from (select * from emp where deptno=30 order by empno) b
--语法正确
select * from emp where deptno=30
union all
select * from emp where deptno=30 order by empno
--错误
select * from (select * from emp where deptno=30 order by empno desc)
union all
select * from (select * from emp where deptno=30 order by empno)