oracle 将多个查询结果合并

article/2025/10/2 19:41:00

       首先要区分一个概况,多个查询结果分两种,一种是一条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 studentwhere id < 4unionselect *from studentwhere 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 studentwhere id > 2 and id < 6unionselect *from studentwhere id < 4

复制代码

看看执行结果是否和你期望的一致?

--Union All

 

复制代码

select *from studentwhere id > 2 and id < 6union allselect *from studentwhere id < 4

复制代码

 

    那么这个呢?答案是一模一样的~

6、据此我们可知,union和union all 区别在于在于对排序的处理。Union All将按照关联的次序组织数据,而Union将进行依据一定规则进行排序。那么这个排序规则是?我们换个查询方式看看:

 

复制代码

select score,id,namefrom studentwhere id > 2 and id < 6unionselect score,id,namefrom studentwhere 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,namefrom studentwhere id > 2unionselect score,id,namefrom studentwhere 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,namefrom studentwhere id > 2 and id < 7unionselect score,id,namefrom studentwhere id < 4unionselect score,id,namefrom studentwhere id > 8order 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获取到的。

谢谢两位博主的分享。


http://chatgpt.dhexx.cn/article/fSpsn74R.shtml

相关文章

mysql 合并两个查询结果

合并两个查询结果 查询结果1&#xff1a; select date(complete_time) as time,sum(amt) as amount_out from withdraw where state3 group by date(complete_time) 查询结果2 select date(update_time) as time,sum(transfer_amount) as amount_in from user_charge where st…

SQL合并查询数据,以逗号分隔

功能描述&#xff1a; 将查询到的数据合并为一条数据&#xff0c;以逗号分隔 案例&#xff1a; 功能描述&#xff1a; 现有三张表&#xff1a; Student&#xff08;学生表&#xff09; Course&#xff08;课程表&#xff09; Student-Course&#xff08;学生课程关联表&am…

MySQL合并查询结果

利用 UNION 关键字&#xff0c;可以给出多条 SELECT 语句&#xff0c;并将它们的结果组合成单个结果集。合并 时&#xff0c;两个表对应的列数和数据类型必须相同。各个 SELECT 语句之间使用 UNION 或 UNION ALL 关键字分隔。UNION 不使用关键字 ALL&#xff0c;执行的时候删除…

SQL如何使两个select语句查询结果合并一个

SQL如何使两个select语句查询结果合并一个&#xff1f; ——在网上看到别人遇到的情况&#xff0c;觉得有点意思&#xff0c;先收集下来~ 解决办法&#xff1a; select isnull(a.unit,b.fine_units) unit,isnull(a.number,0) number,isnull(b.fine_number,0) fine_numberfrom…

sqlsever2019:union合并多个查询结果

文章目录 一、前言二、区别union和连接三、union实例四、union all合并表五、union中的oder by子句六、union自动数据类型转换七、使用union合并不同类型的数据八、union合并不同列数的两个表九、union多表合并 一、前言 表的合并操作将两个表的行合并到一个表中&#xff0c;不…

SQL 列不同的表查询结果合并

两个不同的表进行查询&#xff0c;需要把结果合并&#xff0c; 比如table1的列为 id, user_id, type_id,pro_id&#xff1b; table2的列为 id,user_id,collect_id&#xff1b;分别如下图所示 table1&#xff1a; table2&#xff1a; 将两个表的查询结果合并到一起的查询语…

SQL多个查询结果拼接

今天有一个需求&#xff0c;我有三张表&#xff0c;一张学生表&#xff0c;一张教师表&#xff0c;一样辅导员。 它们都有编号&#xff0c;都有密码&#xff0c;但是字段名不一样&#xff0c;我想一次查询出三张表里面这些编号和密码放在一个查询结果集里面&#xff01; 我们可…

各数据库SQL查询结果多行数据合并成一行

SQL查询结果多行数据合并成一行 一、Oracle函数多行数据合并成一行二、Mysql函数多行数据合并成一行三、sqlserver函数多行数据合并成一行四、postgresql函数多行数据合并成一行 业务需要需要在oracle函数里把多行数据合并成一行&#xff0c;顺道发挥下常用的几种方法。 一、O…

【sql语句基础】——查(select)(合并查询)

目录 合并查询单独查询合并查询——UNION ALLUNION ALL定义UNION ALL代码示例UNION ALL查询结果 合并查询——UNION ALLUNION 定义UNION 代码示例UNION 查询结果 合并查询 当我们需要将多个select查询结果合并在一起的时候&#xff0c;可以使用集合操作符号&#xff1a;union …

微信小程序-循环语句的使用

循环语句的使用 小程序中的循环语句 for&#xff0c;就是在.js中定义循环的数组&#xff0c;把要循环的数据写到数组里面&#xff0c;然后再到*.wxml中进行逐一展示就行了。这里结合一下icon标签的属性来演示 循环语句的基本使用。 重点需要明白的是&#xff1a;小程序中的 fo…

微信小程序-页面FOR循环和嵌套循环

单个循环 <view wx:for"{{pinpaiTishi}}" wx:key"{{xxx}}"><view wx:if"{{item.name!null}}" wx:key"{{xxxx}}">//判断name是否为null<view class"tr"><view class"td-left"></view&…

微信小程序如何双重循环

微信小程序解决双重循环 准备知识 wx:for : 使用数组中各项的数据重复渲染该组件 当前项的下标变量名默认为 index&#xff0c;当前项的变量名默认为 item 可使用 wx:for-item 指定当前元素的变量名&#xff0c;使用 wx:for-index 指定当前下标的变量名 wx:key : 指定列表中项…

微信小程序—for循环包括自定义for循环中的item和index(图文)

微信小程序—for循环包括自定义for循环中的item和index <view wx:for"{{list}}" wx:key"{{index}}"><text>我是第一个循环的内容---{{item}}</text> </view><!-- 自定义for循环的item和index --> <view wx:for-item&quo…

微信小程序:for循环与if判断

for和if一般都写在block里面。 wx:for"{{abc}}"&#xff1a;这是for循环&#xff0c;其中的abc就是你js文件的data里面定义的&#xff0c;一般都是数组。 index默认是循环的下标。 item默认是当前的值。 index和item可以自己定义名字&#xff1a; wx:for-index&q…

微信小程序:wx:for循环输出的使用方法以及简单例子

今天来讲解下循环输出元素 后台存储的数据给事 {var local_database [{date: "Sep 18 2016",post_title:"冬日校花",post_image: "/images/1.jpg",text: "美呀&#xff0c;美呀",view_num: 112,collect_num: 96,turn_num: 515,autho…

微信小程序_for循环

循环展示列表 wxml <text>角色列表1</text> <view><!-- 默认item是循环列表的每一个元素&#xff0c;index是索引 可以用过 --><view wx:for"{{dataList}}">{{index}}-{{item}}</view> </view> <text>角色列表2&…

微信小程序for循环遍历数组解决办法

最近在做微信小程序项目遇到一个问题&#xff0c;如下&#xff1a; 在wxml文件做wx:for循环遍历数组时&#xff0c;数组含八个元素&#xff0c;循环次数却只有五次&#xff0c;从下面代码看 <scroll-view scroll-ytrue style"height: 262rpx;"><view class…

微信小程序 if语法、for循环 条件渲染、列表渲染等讲解

这篇文章我想给大家学习的就是如何使用 if 去判断 组件的是显示和隐藏&#xff0c;如何使用for循环来渲染列表等重复的内容。 1.if语法的使用 在小程序中&#xff0c;我们可以使用wx:if"{{条件}}"来判断是否需要渲染该代码块 也可以用 wx:elif 和wx:else 来添加 el…

微信小程序-for循环

微信小程序-for循环 通过wx:for可以根据指定的数组&#xff0c;循环渲染重复的组件结构&#xff0c;语法示例如下&#xff1a; <view wx:for"{{arr}}">索引是&#xff1a;{{index}} -> 当前项是&#xff1a;{{item}}</view>默认情况下&#xff0c;当…

微信小程序之for循环

在微信小程序中也有for循环,用于进行列表渲染。 官方实例 打开微信开发者文档,在框架部分的视图层--》wxml--》列表渲染中可以看到官方给出的for循环实例,在实例中 可以看到下面相关说明。 默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item;使用 …