0
点赞
收藏
分享

微信扫一扫

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 条评论