MS-SQL中多个表或结果集的组合的方法

     MS-SQL 如果将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行,常用的方法如下:
一.       使用union union All语句
1.   union 与 union all语句的区别
Ø         UNION 组合多个表(或结果集)并将其作为单个结果集返回 ;
Ø         UNION ALL 在结果中包含所有的行,包括重复行。
Ø         也就是说,使用 UNION 组合两个表时,将重复的记录删除;而使用 UNION ALL 组合两多个表时,不考虑结果集中是否存在重复记录。
2.   使用 UNION 运算符时请注意:
Ø         所有查询中的列数和列的顺序必须相同。
     在使用 UNION 运算符组合的语句中,所有显示列表的数目必须相同(列表内容可以包括:列名、算术表达式、聚合函数等);
Ø         数据类型必须兼容。
     在使用 UNION 组合的结果集中的相应列必须具有相同数据类型,或者两种数据类型之间存在隐性数据转换,或提供了类型转换。例如,在 datetime 数据类型的列和 binary 数据类型的列之间不可能存在 UNION 运算符,除非提供了显式转换,而在 money 数据类型的列和 int 数据类型的列之间可以存在 UNION 运算符,因为它们可以进行隐性转换。
Ø         UNION 运算符组合的各语句中对应的结果集列出现的顺序必须相同,因为 UNION 运算符是按照各个查询给定的顺序逐个比较各列。    
3.   与其它 Transact-SQL 语句一起使用 UNION 语句时,应注意:
Ø         如果在有 UNION 的语句中使用 INTO 语句,则只能在最终表(或结果集)中使用,如果要在单个表(或结果集)中使用 INTO 语句, MS-SQL 将会提示错误;
错误语句: Select AID,AName,ADemo Into From ATable Union All Select BID,BName,BDemo Into From Btable
Ø         只有在 UNION 语句的结尾,才允许使用 ORDER BY COMPUTE 子句以定义最终结果的顺序或计算汇总值。不能在组建 UNION 语句的单独查询中使用这些子句。
错误语句:
Select AID,AName,ADemo From ATable order by AID
Union All
Select BID,BName,BDemo From BTable Order By BID  
可以这样写:
Select * From
(Select AID,AName,ADemo From ATable Union All Select BID,BName,BDemo From BTable) a
Order By a.AID
也可以这样写:
    Select AID,AName,ADemo From ATable
    Union All
    Select BID,BName,BDemo From BTable
      Order By AID
   此处之所以按 AID 来排序,是因为 MS-SQL 中将最后的结果表中的第一列命名为 AID 。某些 DBMS 的系统并不对使用不同列名的查询的表列命名,这样就不能使用 Order By 列名的方式来排序,不过可以引用结果表中列的顺序来排序,例如: Order By 1, 则相当于 Order By AID
Ø         GROUP BY HAVING 子句只能在单独的查询中使用;它们不能用来影响最终的结果集。
Ø         UNION 运算符可用于 INSERT 语句中。
     FOR BROWSE 子句不能在包含 UNION 运算符的语句中使用。( FOR BROWSE 使用及说明可以参考 SELECT 语句的说明)
   注意:某些 DBMS 系统在由 UNION 组合查询的 Select 子句中不允许使用函数和表达式。
 
二.       使用except INTERSECT 运算符
      UNION 相似, except INTERSECT 运算符也可以将多个表(或结果集)组合生成一个新表(或结果集),只是结果不同而已。
1.   Except 运算符
    UNION 指令类似, Except 也是对两个 SQL 语句所产生的结果做处理的。不同的地方是 Except 在每一个表(或结果集)与第二个表(或结果集)比较前,已从每一个表的结果集中清除了所有重复的信息。也就是从 Except 运算所得到的结果集绝不会包含重复的记录(行)。
    例如:我们要在 Table_A( 学生信息表 ) Table_B( 学生必修课完成信息表 ) 中找出未完成的学生信息
       Select * From Table_A
       Except
       Select * From Table_B
    注意:许多 DBMS 系统不支持 EXCEPT 运算符,则此时不得不使用 Left Outer Join 运算符来实现。而在 Oracle 中的 Minus EXCEPT 相似。
2.      INTERSECT 运算符
    UNION 指令类似, INTERSECT 也是对两个 SQL 语句所产生的结果做处理的。不同的地方是, UNION 是联集,而 INTERSECT 是交集。也就是说, INTERSECT 生成的结果集是多个表或结果集所共有的记录(行)。
       Select AID,AName,ADemo From ATable
       INTERSECT
Select BID,BName,BDemo From Btable
 
三.    使用UNION Corresponding组合来自两个或多个与UNION不兼容的表中的行
 例如:有两个表
   Create Table Table_A(ID int,office int,address varchar(20),department char(5),pay money)
   Create Table Table_B(office int,ID int,address varchar(20),department char(5))
   可以使用UNION Corresponding来获取两个表中有共同列名的列中数据:
   Select * From table_A UNION Corresponding Select * From Table_b
  
  

注意:并不是所有的DBMS都支持UNION Corresponding运算,包括MS-SQL Server

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值