oracle 将多个查询结果合并

       首先要区分一个概况,多个查询结果分两种,一种是一条sql查询多个结果,还有一种是多条sql语句查询出多个结果。

       先看第一个,一条语句查询出多个结果,将多个结果合并成一条记录:

       在oracle中有一个wm_concat()函数。

oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oraclewm_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。

以上案例借鉴于:https://www.cnblogs.com/qianyuliang/p/6649983.html

 

接下来看将多个语句的查询结果合并:

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);

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,b,c...的顺序进行的order by。即结果是order by a,b,c...........的。我们看下一个查询:

 

复制代码

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指定就可以了呢?答案是肯定的,不过在写法上有需要注意的地方:

 

复制代码

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都有效。

7、注意:

    1,Union可以对字段名不同但数据类型相同的结果集进行合并;

    2,如果字段名不同的结果集进行Union,那么对此字段的Order by子句将失效。

    这里一起总结一下:

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

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

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

上面这个栗子我是从https://www.cnblogs.com/yuanchaoyong/p/6213885.html获取到的。

谢谢两位博主的分享。

<think>好的,我现在需要解决用户的问题:如何在Oracle数据库中合并多个查询结果,特别是使用UNION和UNION ALL的示例教程。首先,我要回忆一下用户提供的引用内容,看看有没有相关的信息可以利用。 根据引用[1],用户提到了UNION ALL在合并结果集时不会去重,而联合后的结果集有7条记录。引用[3]也说明当需要将两个select的结果整体显示时,需要使用UNION或UNION ALL。引用[4]中的MySQL示例可能对Oracle也有参考价值,但需要确认Oracle是否语法相同。 首先,我需要明确UNION和UNION ALL的区别。UNION会合并结果并去重,而UNION ALL直接合并,包括重复记录。用户可能需要示例来说明这两种操作的不同效果。 然后,我需要考虑如何构造示例查询。假设用户有两个表,比如T_GIRL和T_GIRL_HIS,如引用[1]提到的。可以演示从这两个表中选择数据,并用UNION和UNION ALL合并。比如: 使用UNION ALL合并两个表的数据,结果包含所有行,不去重。而使用UNION则会去除重复行。需要确保两个SELECT语句的列数和数据类型一致,否则会报错。 接下来,要给出具体的示例代码,并说明结果的不同。比如,假设每个表有3条数据,其中有一条重复,那么UNION ALL会显示6条,而UNION显示5条。这样用户能直观看到区别。 另外,用户可能需要知道使用场景。比如需要保留所有记录时用UNION ALL,效率更高;需要去重时用UNION,但性能可能较差,因为涉及排序去重。 还需要注意,Oracle中的UNION操作会对结果进行排序去重,而UNION ALL不会,这可能影响性能。在处理大数据量时,应优先考虑UNION ALL,除非确实需要去重。 最后,根据用户提供的引用,特别是引用[1]中的例子,可以引用该例子来说明结果集的数量变化,比如使用UNION ALL后结果有7条,而使用UNION可能减少到更少。 总结回答的结构应该是:先解释两者的区别,然后给出示例代码和结果,接着说明注意事项和使用场景,最后生成相关问题。同时,确保在回答中正确引用用户提供的引用内容,比如引用[1]和[3]。</think>在Oracle数据库中合并多个查询结果,主要通过`UNION`和`UNION ALL`操作符实现。以下是具体说明和示例: --- ### 一、UNION 与 UNION ALL 的区别 1. **`UNION`** - 合并两个结果集,并**自动去重** - 默认对结果集排序 - 语法:`SELECT ... UNION SELECT ...` 2. **`UNION ALL`** - 合并两个结果集,**保留所有重复数据** - 不排序,执行效率更高 - 语法:`SELECT ... UNION ALL SELECT ...` --- ### 二、操作示例 假设存在两个表:`T_GIRL`(当前数据)和`T_GIRL_HIS`(历史数据),结构均为`(id, name, yz, sc)`。 #### 1. 使用 `UNION ALL` 合并结果(保留重复数据) ```sql SELECT id, name, yz, sc FROM T_GIRL UNION ALL SELECT id, name, yz, sc FROM T_GIRL_HIS; ``` - **结果**:直接拼接两个表的所有数据。若`T_GIRL`有3条,`T_GIRL_HIS`有4条,合并后共7条记录[^1]。 #### 2. 使用 `UNION` 合并结果(去重) ```sql SELECT id, name, yz, sc FROM T_GIRL UNION SELECT id, name, yz, sc FROM T_GIRL_HIS; ``` - **结果**:若两表有1条重复数据,合并后共6条记录[^3]。 --- ### 三、注意事项 1. **列数与数据类型必须一致** 若查询的列数或数据类型不一致,会报错。例如: ```sql -- 错误示例:列数不一致 SELECT id, name FROM T_GIRL UNION ALL SELECT id FROM T_GIRL_HIS; -- 报错 ``` 2. **排序与去重的代价** `UNION`因需要去重和排序,性能低于`UNION ALL`。大数据量时优先用`UNION ALL`。 3. **别名与表达式** 若需对列使用别名或表达式,需确保所有SELECT语句的列名一致: ```sql SELECT id AS user_id, name FROM T_GIRL UNION ALL SELECT user_id, user_name FROM T_GIRL_HIS; -- 列名需匹配 ``` --- ### 四、应用场景 - **`UNION ALL`适用场景**:统计日志表和历史表的总量、合并不关心重复的数据。 - **`UNION`适用场景**:生成唯一值列表(如去重的用户ID集合)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值