关于结果集合并问题

原创 2012年03月29日 10:49:31
table A
id,name
1,marry
2,jack

table B
id       word
1001  abce
1002  1234

想得到的结果是
id   content
1  marry
2  jack
1001  abce
1002  1234

在不产生新表的情况下用SELECT语句如何做到?
 
select * from a union all select * from b
 
 
 
 
 
 
 
 
 
 
假设我们有一个表Student,包括以下字段与数据:
drop table student;   
  
create table student   
(   
id int primary key,   
name nvarchar2(50) not null,   
score number not null  
);   
  
insert into student values(1,'Aaron',78);   
insert into student values(2,'Bill',76);   
insert into student values(3,'Cindy',89);   
insert into student values(4,'Damon',90);   
insert into student values(5,'Ella',73);   
insert into student values(6,'Frado',61);   
insert into student values(7,'Gill',99);   
insert into student values(8,'Hellen',56);   
insert into student values(9,'Ivan',93);   
insert into student values(10,'Jay',90);   
  
commit;
首先,我们来看一下UNION的例子:
SQL> select *   
  2  from student   
  3  where id<4   
  4  union   
  5  select *   
  6  from student   
  7  where id>2 and id<6   
  8  ;   
  
        ID NAME                                SCORE   
---------- ------------------------------ ----------   
         1 Aaron                                  78   
         2 Bill                                   76   
         3 Cindy                                  89   
         4 Damon                                  90   
         5 Ella                                   73   
  
SQL>  
如果换成Union All连接两个结果集,则结果如下:
SQL> select *   
  2  from student   
  3  where id<4   
  4  union all   
  5  select *   
  6  from student   
  7  where id>2 and id<6   
  8  ;   
  
        ID NAME                                SCORE   
---------- ------------------------------ ----------   
         1 Aaron                                  78   
         2 Bill                                   76   
         3 Cindy                                  89   
         3 Cindy                                  89   
         4 Damon                                  90   
         5 Ella                                   73   
  
6 rows selected.  
可以看到,Union和Union All的区别之一在于对重复结果的处理。
接下来,我们交换一个两个SELECT语句的顺序,看看结果是怎样的。
SQL> select *   
  2  from student   
  3  where id>2 and id<6   
  4  union   
  5  select *   
  6  from student   
  7  where id<4   
  8  ;   
  
        ID NAME                                SCORE   
---------- ------------------------------ ----------   
         1 Aaron                                  78   
         2 Bill                                   76   
         3 Cindy                                  89   
         4 Damon                                  90   
         5 Ella                                   73   
  
SQL> select *   
  2  from student   
  3  where id>2 and id<6   
  4  union all   
  5  select *   
  6  from student   
  7  where id<4   
  8  ;   
  
        ID NAME                                SCORE   
---------- ------------------------------ ----------   
         3 Cindy                                  89   
         4 Damon                                  90   
         5 Ella                                   73   
         1 Aaron                                  78   
         2 Bill                                   76   
         3 Cindy                                  89   
  
6 rows selected.
可以看到,对于UNION来说,交换两个SELECT语句的顺序后结果仍然是一样的,这是因为UNION会自动排序。而UNION ALL在交换了SELECT语句的顺序后结果则不相同,因为UNION ALL不会对结果自动进行排序。
那么这个自动排序的规则是什么呢?我们交换一下SELECT后面选择字段的顺序(前面使用SELECT *相当于SELECT ID,NAME,SCORE),看看结果如何:
SQL> select score,id,name   
  2  from student   
  3  where id<4   
  4  union   
  5  select score,id,name   
  6  from student   
  7  where id>2 and id<6   
  8  ;   
  
     SCORE         ID NAME   
---------- ---------- ------------------------------   
        73          5 Ella   
        76          2 Bill   
        78          1 Aaron   
        89          3 Cindy   
        90          4 Damon  
可是看到,此时是按照字段SCORE来对结果进行排序的(前面SELECT *的时候是按照ID进行排序的)。
那么有人会问,如果我想自行控制排序,能不能使用ORDER BY呢?当然可以。不过在写法上有需要注意的地方:
select score,id,name   
from student   
where id > 2 and id < 7   
  
union   
  
select score,id,name   
from student   
where id < 4   
  
union   
  
select score,id,name   
from student   
where id > 8   
order by id desc  
order by子句必须写在最后一个结果集里,并且其排序规则将改变操作后的排序结果。对于Union、Union All、Intersect、Minus都有效。
其他的集合操作符,如Intersect和Minus的操作和Union基本一致,这里一起总结一下:

Union,对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序(按显示的第一个字段进行排序);

Union All,对两个结果集进行并集操作,包括重复行,不进行排序;

Intersect,对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;

Minus,对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。

可以在最后一个结果集中指定Order by子句改变排序方式。

mycat 结果集合并源码分析

结果合并 在SQL下发流程和前后端验证流程中介绍过,通过用户验证的后端连接绑定的NIOHandler是MySQLConnectionHandler实例,在MySQL服务端返回执行结果时会调用到M...
  • jaryle
  • jaryle
  • 2017年09月05日 12:13
  • 146

文章标题多表查询:合并结果集,连接查询,子查询

多表查询 分类: * 合并结果集 * 连接查询 内连接 外链接 全连接 * 子查询【1】合并结果集...
  • u013033038
  • u013033038
  • 2015年03月23日 11:04
  • 1061

mysql:如何合并两个查询的结果集的数据

(新用户)通过表A获取的记录集,如下: 1   2012-11-1 3   2012-11-2 8   2012-11-5 (老用户)通过表B获取的记录集,如下: 5   201...
  • rongwenbin
  • rongwenbin
  • 2014年05月29日 10:23
  • 1744

oracle数据库将多个列的查询结果集合并到一行中

oracle数据库使用系统函数将多个列的查询结果集合并到一行中。
  • qin904863396
  • qin904863396
  • 2017年01月03日 19:34
  • 6776

PostgreSql 合并多行记录

需求描述: A表有如下数据 id 1 2 3 4 B表有如下数据 id name 1 aaa ...
  • mynacche
  • mynacche
  • 2013年07月03日 09:30
  • 4549

关于数据库合并问题整理

-(void)downLoadFile:(VoodaProgressHUD *)downFileHud { 请求服务器数据data     UserModel * user = [AppDele...
  • zwl492454828
  • zwl492454828
  • 2016年09月29日 11:27
  • 518

Hibernate合并查询结果集为实体类

用过mybatis的小伙伴可能都知道,我们可以查询两个表的部分字段合并为一个实体。然而用了Hibernate这么久了,居然还不知道也有此神器。说明一般来说,Hibernate中我们常用的有以下几个功能...
  • zhulin2012
  • zhulin2012
  • 2017年08月30日 11:51
  • 318

ruby on rails 合并多个结果集并排序

在最近工作中,遇到多个reust,需要显示在同一个dialog中的问题,并且按照时间排序,查阅了不少资料,寻找到一种有效的解决办法,如下:        1,针对同一张表查询出来的多个结果集需要合...
  • OldLock
  • OldLock
  • 2017年07月19日 17:05
  • 249

mysql 合并两个查询结果

合并两个查询结果 查询结果1: select date(complete_time) as time,sum(amt) as amount_out from withdraw where stat...
  • yilip
  • yilip
  • 2016年01月11日 18:22
  • 17403

MS SQL 合并结果集并求和

业务情景: 有这样一张表: 其中Id列为表主键,Name为用户名,State为记录的状态值,Note为状态的说明,方便阅读。 需求描述:需要查询出这样的结果:某个人某种状态的记录数,如:张三,待审...
  • a497785609
  • a497785609
  • 2015年02月13日 10:59
  • 6617
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于结果集合并问题
举报原因:
原因补充:

(最多只允许输入30个字)