union

学习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

例如,Table1Table2 具有相同的两列结构。

Table1  Table2 
ColumnAColumnB ColumnCColumnD
char(4)int char(4)int
---------- ----------
abc1 ghi3
def2 jkl4
ghi3 mno5

下面的查询在这两个表之间创建 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

在第一个语句中,将消除 TableBTableC 之间的联合中的重复行。而在该集与 TableA 之间的并集中,不消除重复行。在第二个语句中,TableATableB 之间的联合中包含重复行,但在随后与 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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章