oracle将多个查询结果合并
⾸先要区分⼀个概况,多个查询结果分两种,⼀种是⼀条sql查询多个结果,还有⼀种是多条sql语句查询出多个结果。 先看第⼀个,⼀条语句查询出多个结果,将多个结果合并成⼀条记录:
在oracle中有⼀个wm_concat()函数。
oracle wm_concat(column)函数使我们经常会使⽤到的,下⾯就教您如何使⽤wm_concat(column)函数实现字段合并如:
shopping:
-----------------------------------------
u_id goods num
------------------------------------------
1 苹果 2
2 梨⼦ 5
1 西⽠ 4
3 葡萄 1
3 ⾹蕉 1
1 橘⼦ 3
=======================
想要的结果为:
--------------------------------
u_id goods_sum
____________________
1 苹果,西⽠,橘⼦
2 梨⼦
3 葡萄,⾹蕉
---------------------------------
select u_id, wmsys.wm_concat(goods) goods_sum from shopping group by u_id
想要的结果2:
--------------------------------
u_id goods_sum
____________________
1 苹果(2⽄),西⽠(4⽄),橘⼦(3⽄)
2 梨⼦(5⽄)
3 葡萄(1⽄),⾹蕉(1⽄)
---------------------------------
使⽤oracle wm_concat(column)函数实现:
select u_id, wmsys.wm_concat(goods || '(' || num || '⽄)' ) goods_sum from shopping group by u_id。
以上案例借鉴于:
接下来看将多个语句的查询结果合并:
oracle 中有union() union all()函数:
下⾯我举个栗⼦:
对这个概念理解可能会有些模糊。我们通过实例来讲解,⾸先创建⼀个表Student,插⼊⼀些相应的测试数据。sql语句如下:
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);
sql中union多表合并insert into student values(9,'Ivan',93);
insert into student values(10,'Jay',90);
commit;
3、测试 union 命令的结果集,sql语句如下:
select *
from student
where id < 4
union
select *
from student
where id > 2 and id < 6
4、结果将是:
1 Aaron 78
2 Bill 76
3 Cindy 89
4 Damon 90
5 Ella 73
5、如果将union换成union all连接两个结果集,则返回结果是:
1 Aaron 78
2 Bill 76
3 Cindy 89
3 Cindy 89
4 Damon 90
5 Ella 73
⼩结: 可以看到,Union和Union All的区别之⼀在于对重复结果的处理。接下来我们将两个⼦查询的顺序调整⼀下,改为--Union
select *
from student
where id > 2 and id < 6
union
select *
from student
where id < 4
看看执⾏结果是否和你期望的⼀致?
--Union All
select *
from student
where id > 2 and id < 6
union all
select *
from student
where id < 4
那么这个呢?答案是⼀模⼀样的~
6、据此我们可知,union和union all 区别在于在于对排序的处理。Union All将按照关联的次序组织数据,⽽Union将进⾏依据⼀定规则进⾏排序。那么这个排序规则是?我们换个查询⽅式看看:
select score,id,name
from student
where id > 2 and id < 6
union
select score,id,name
from student
where id < 4
结果如下:
73 5 Ella
76 2 Bill
78 1 Aaron
89 3 Cindy
90 4 Damon
和我们预料的⼀致:将会按照字段的顺序进⾏排序。之前我们的查询是基于id,name,score的字段顺序,那么结果集将按照id优先进⾏排序;⽽现在新的字段顺序也改变了查询结果的排序。并且,是按照给定字段a,的顺序进⾏的order by。即结果是order by a,的。我们看下⼀个查询:
select score,id,name
from student
where id > 2
union
select score,id,name
from student
where id < 4
结果如下:
56 8 Hellen
61 6 Frado
73 5 Ella
76 2 Bill
78 1 Aaron
89 3 Cindy
90 4 Damon
90 10 Jay
93 9 Ivan
99 7 Gill
可以看到,对于score相同的记录,将按照下⼀个字段id进⾏排序。如果我们想⾃⾏控制排序,是不是⽤order by指定就可以了呢?答案是肯定的,不过在写法上有需要注意的地⽅:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论