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小时内删除。