MSSQL中多个表或结果集的组合的方法

在MSSQL如果将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行,常用的方法如下:
一.       使用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。
http://blog.csdn.net/sxycgxj/archive/2007/03/02/1518751.aspx

时间: 2024-08-03 20:54:32

MSSQL中多个表或结果集的组合的方法的相关文章

php+mysqli实现将数据库中一张表信息打印到表格里的方法_php技巧

本文实例讲述了php+mysqli实现将数据库中一张表信息(包括表头)打印到表格里的方法.分享给大家供大家参考.具体如下: 这段代码将就看吧.需要学习基础知识.代码如下: 复制代码 代码如下: <?php $mysqli = new MySQLi("localhost","root","123456","liuyan"); if(!$mysqli){  die($mysqli->error); } function

ASP调用带参数的MSSQL存储过程,并返回临时表记录集

前些天,阿里西西web团队(Alixixi.com)在开发一个系统平台时,需要通过存储过程调用多个表的几个字段,合并到一个临时表中,并进行排序返回给ASP调用. 下面,我把经验分享出来: 1.存储过程部分: 以下是存储过程部分:CREATE PROCEDURE [dbo].[alixixi] @sNum int, @sOrder varchar(20)  AS SET nocount on create table #btable (id int,channelid int,classid in

在MSSQL中实现Sequence功能

目的: 通过该功能取代 MSSQL 中的表ID列自动递增功能   主题一:如何通过Sequence名得到一个Sequence值 方法: 1.    创建一个表Sequence,保存Sequence的值 2.    创建一个存储过程GetNextSequence,以通过它得到下一个Sequence 主题二:如何通过一个表名得到一个Sequence值 1.    创建一个表TableSequence,保存表中的列对应的是哪个Sequence 2.    创建一个存储过程CreateTableSeq,

用 INNER JOIN语法联接多个表建记录集

记录集|语法 用 INNER JOIN语法联接多个表建记录集 多表联接建立记录集是十分有用的,因为某些情况下,我们需要把数字数据类型显示为相应的文本名称,这就遇到了多表联接建立记录集的问题.比如作一个会员注册系统,共有五个表,会员信息数据表member.会员身份表MemberIdentity.会员权限表MemberLevel.会员类别表MemberSort和会员婚姻状况表Wedlock.如果想把会员注册信息全部显示出来,肯定要将这四个表连起来,否则大家看到的某些会员信息可能只是数据编号.   

PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解

本篇文章是对PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的方法进行了详细的分析介绍,需要的朋友参考下   [PHP Source Code]: 复制代码 代码如下: $dbh = new PDO('sqlsrv:server=连接地址;Database=数据库名', 用户名, 密码); try {  $procName = "P_Test_GetMixData";  $stmt = $dbh->prepare("EXEC $p

MSSQL · 应用案例 · 日志表设计优化与实现

摘要 这篇文章从日志表问题引入.日志表的共有特性.日志表的设计需求.设计思路以及设计详细实现的角度,阐述了在SQL Server数据库中如何最优化设计日志表来降低系统资源的占用和提高系统吞吐量. 问题引入 在平时与客户服务与交流过程中,我们不止一次的被客人问及这样的场景:我们现在面临如何设计SQL Server日志表方案,如何最优化设计数据库日志记录表.因为,日志表设计会面对如下问题: 表记录数大:日志表由于记录了应用程序的很多操作日志,有的业务有很多步骤,甚至每个步骤操作都会被记录到日志表中

SQL Server在AlwaysOn中使用内存表的“踩坑”记录

前言 最近因为线上alwayson环境的一个数据库上使用内存表.经过大概一个星期监控程序发现了一个非常严重问题这个数据库的日志文件不会截断,已用空间一直在增加(存在定时的每个小时的日志备份),同时内存表数据库文件也无法删除,下面就介绍一下后面我的处理过程,话不多说了,来一起看看详细的介绍吧. 数据库:SQL Server2014 Enterprise Edition (64-bit) 删除文件 使用一个单独非alwayson环境的数据库测试. 一.创建内存表 ---创建内存表文件组 ALTER

mssql中如何将参数传递到括号内

问题描述 mssql中如何将参数传递到括号内 我的数据库中一些表有数据,一些表无数据,我需要把有数据的表名称提取出来,但是不删除(仅仅提取表名称而已).写了以下这段话,求指正.没分悬赏了,感谢好心人.declare @id int@maxid int@name char(100)@sql nvarchar(max); set @id=1;select @maxid =max(id) from tablename; while @id<=@maxid beginselect @name=name

对象-两张表查询 结果集set的时候怎么处理 表A 和表B 是两个不同的实体

问题描述 两张表查询 结果集set的时候怎么处理 表A 和表B 是两个不同的实体 String sql = ""SELECT * FROM CLOUD_BOBA_BLOG_CATE""; PreparedStatement pstmt = null ; DataBaseConnection dbc = null ; try{ // 连接数据库 dbc = new DataBaseConnection() ; pstmt = dbc.getConnection().p