在MS-SQL如果将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行,常用的方法如下:
一. 使用union 或union All语句
1. union 与 union all语句的区别
Ø
UNION
组合多个表(或结果集)并将其作为单个结果集返回
;
Ø
UNION ALL
在结果中包含所有的行,包括重复行。
Ø
也就是说,使用
UNION
组合两个表时,将重复的记录删除;而使用
UNION ALL
组合两多个表时,不考虑结果集中是否存在重复记录,包括重复行。
2.
使用
UNION
运算符时请注意:
(1)
所有查询中的列数和列的顺序必须相同。
在使用
UNION
运算符组合的语句中,所有显示列表的数目必须相同(列表内容可以包括:列名、算术表达式、聚合函数等);
(2)
数据类型必须兼容。
在使用
UNION
组合的结果集中的相应列必须具有相同数据类型,或者两种数据类型之间存在隐性数据转换,或提供了类型转换。例如,在
datetime
数据类型的列和
binary
数据类型的列之间不可能存在
UNION
运算符,除非提供了显式转换,而在
money
数据类型的列和
int
数据类型的列之间可以存在
UNION
运算符,因为它们可以进行隐性转换。
(3)
用
UNION
运算符组合的各语句中对应的结果集列出现的顺序必须相同,因为
UNION
运算符是按照各个查询给定的顺序逐个比较各列。
3.
与其它
Transact-SQL
语句一起使用
UNION
语句时,应注意:
(1)
如果在有
UNION
的语句中使用
INTO
语句,则只能在最终表(或结果集)中使用,如果要在单个表(或结果集)中使用
INTO
语句,
MS-SQL
将会提示错误;
错误语句:
Select AID,AName,ADemo Into From ATable Union All Select BID,BName,BDemo Into From Btable
(2)
只有在
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
(1)
GROUP BY
和
HAVING
子句只能在单独的查询中使用;它们不能用来影响最终的结果集。
(2)
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。