Oracle中Union与Union All的区别(适用多个数据库)

如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来

Union 与 Union ALL 的作用都是合并 SELECT 的查询结果集,那么它们有什么不同呢?

Union 将查询到的结果集合并后进行重查,将其中相同的行去除。缺点:效率低;
而Union ALL 则只是合并查询的结果集,并不重新查询,效率高,但是可能会出现冗余数据。

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

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

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

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

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

例如:

复制代码 代码如下:
select employee_id,job_id from employees
union
select employee_id,job_id from job_history

以上将两个表的结果联合在一起。这两个例子会将两个select语句的结果中的重复值进行压缩,也就是结果的数据并不是两条结果的条数的和。如果希望即使重复的结果显示出来可以使用union all,例如:

2.在oracle的scott用户中有表emp

复制代码 代码如下:
select * from emp where deptno >= 20
union all
select * from emp where deptno <= 30

这里的结果就有很多重复值了。

有关union和union all关键字需要注意的问题是:

union 和 union all都可以将多个结果集合并,而不仅仅是两个,你可以将多个结果集串起来。
使用union和union all必须保证各个select 集合的结果有相同个数的列,并且每个列的类型是一样的。但列名则不一定需要相同,oracle会将第一个结果的列名作为结果集的列名。例如下面是一个例子:

代码如下:
select empno,ename from emp
union
select deptno,dname from dept

我们没有必要在每一个select结果集中使用order by子句来进行排序,我们可以在最后使用一条order by来对整个结果进行排序。例如:

复制代码 代码如下:

select empno,ename from emp
union
select deptno,dname from dept
order by ename;

转自:http://www.jb51.net/article/30792.htm

本人写的,比较复杂一点的sql(left join  union all)

-- 查询基本信息
select * from
(
select
max(trans_item.BASIC_TERM_ID) BASIC_TERM_ID,
trans_item.APP_TERM_NO APP_TERM_NO,
max(trans_item.DEVICE_TYPE) DEVICE_TYPE,
max(trans_item.MODEL_DESC) MODEL_DESC,
max(trans_item.branch_name) branch_name,
max(trans_item.sub_name) sub_name,
max(trans_item.self_name) self_name,
max(trans_item.INST_TYPE) INST_TYPE
from(
select    term.TERMINAL_ID BASIC_TERM_ID,
term.APP_TERM_NO APP_TERM_NO,
device.DEVICE_TYPE DEVICE_TYPE,
model.MODEL_DESC MODEL_DESC,
branch.SHORT_NAME branch_name,
subbranch.SHORT_NAME sub_name,
self.SHORT_NAME self_name,
self.INST_TYPE INST_TYPE
from SELFCUR.OPS_TERMINAL_INFO    term,
SELFCUR.OPS_DEVICE_INFO     device,
SELFCUR.OPS_DEVICE_MODEL    model,
SELFCUR.OPS_INSTITUTION     branch,
SELFCUR.OPS_INSTITUTION     subbranch,
SELFCUR.OPS_INSTITUTION     self,
SELFCUR.BIZ_MAIN_TRANS    trans
where    trans.TERM_ID=term.APP_TERM_NO
and term.TERMINAL_ID=device.TERMINAL_ID
and device.MODEL_ID=model.MODEL_ID
and term.INST_ID=self.INST_ID
and self.PARENT_INST_ID=subbranch.INST_ID
and subbranch.PARENT_INST_ID=branch.INST_ID
-- 这里需要加入特殊符号来标识,用界面传过来的参数组成sql进行替换
--XXXXYYYY--
union all
select    term.TERMINAL_ID BASIC_TERM_ID,
term.APP_TERM_NO APP_TERM_NO,
device.DEVICE_TYPE DEVICE_TYPE,
model.MODEL_DESC MODEL_DESC,
branch.SHORT_NAME branch_name,
subbranch.SHORT_NAME sub_name,
self.SHORT_NAME self_name,
self.INST_TYPE INST_TYPE
from SELFCUR.OPS_TERMINAL_INFO    term,
SELFCUR.OPS_DEVICE_INFO     device,
SELFCUR.OPS_DEVICE_MODEL    model,
SELFCUR.OPS_INSTITUTION     branch,
SELFCUR.OPS_INSTITUTION     subbranch,
SELFCUR.OPS_INSTITUTION     self,
SELFCUR.BIZ_MAIN_TRANS_HIS    trans_his
where    trans_his.TERM_ID=term.APP_TERM_NO
and term.TERMINAL_ID=device.TERMINAL_ID
and device.MODEL_ID=model.MODEL_ID
and term.INST_ID=self.INST_ID
and self.PARENT_INST_ID=subbranch.INST_ID
and subbranch.PARENT_INST_ID=branch.INST_ID
-- 这里需要加入特殊符号来标识,用界面传过来的参数组成sql进行替换
--XXXXYYYY--
)trans_item
group by trans_item.APP_TERM_NO
)trans_basic
left join(
-- 联通缴费
select
trans_pay_lt.TERM_ID TERM_ID,
) PAY_LT_Count,
sum(trans_pay_lt.TRAN_AMT) PAY_LT_Money
from(
select trans.TERM_ID TERM_ID,
trans.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS trans
'
'
union all
select trans_his.TERM_ID TERM_ID,
trans_his.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS_HIS trans_his
'
'
) trans_pay_lt
group by trans_pay_lt.TERM_ID
)trans_pay_lt_l
on
trans_basic.APP_TERM_NO=trans_pay_lt_l.TERM_ID
left join(
-- 移动缴费
select
trans_pay_yd.TERM_ID TERM_ID,
) PAY_YD_Count,
sum(trans_pay_yd.TRAN_AMT) PAY_YD_Money
from(
select trans.TERM_ID TERM_ID,
trans.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS trans
'
'
union all
select trans_his.TERM_ID TERM_ID,
trans_his.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS_HIS trans_his
'
'
) trans_pay_yd
group by trans_pay_yd.TERM_ID
)trans_pay_yd_l
on
trans_basic.APP_TERM_NO=trans_pay_yd_l.TERM_ID
left join(
-- 查询电信缴费
select
trans_pay_dx.TERM_ID TERM_ID,
) PAY_DX_Count,
sum(trans_pay_dx.TRAN_AMT) PAY_DX_Money
from(
select trans.TERM_ID TERM_ID,
trans.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS trans
'
'
union all
select trans_his.TERM_ID TERM_ID,
trans_his.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS_HIS trans_his
'
'
) trans_pay_dx
group by trans_pay_dx.TERM_ID
)trans_pay_dx_l
on
trans_basic.APP_TERM_NO=trans_pay_dx_l.TERM_ID
left join(
-- 电力缴费
select
trans_pay_dl.TERM_ID TERM_ID,
) PAY_DL_Count,
sum(trans_pay_dl.TRAN_AMT) PAY_DL_Money
from(
select trans.TERM_ID TERM_ID,
trans.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS trans
'
--重庆电力014 三峡电力 008
')
union all
select trans_his.TERM_ID TERM_ID,
trans_his.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS_HIS trans_his
'
--重庆电力014 三峡电力 008
')
) trans_pay_dl
group by trans_pay_dl.TERM_ID
)trans_pay_dl_l
on
trans_basic.APP_TERM_NO=trans_pay_dl_l.TERM_ID
left join(
-- 自来水缴费
select
trans_pay_zls.TERM_ID TERM_ID,
) PAY_ZLS_Count,
sum(trans_pay_zls.TRAN_AMT) PAY_ZLS_Money
from(
select trans.TERM_ID TERM_ID,
trans.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS trans
'
--水务2测试 004 水费 005
')
union all
select trans_his.TERM_ID TERM_ID,
trans_his.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS_HIS trans_his
'
--水务2测试 004 水费 005
')
) trans_pay_zls
group by trans_pay_zls.TERM_ID
)trans_pay_zls_l
on
trans_basic.APP_TERM_NO=trans_pay_zls_l.TERM_ID
left join(
-- 燃气缴费
select
trans_pay_rq.TERM_ID TERM_ID,
) PAY_RQ_Count,
sum(trans_pay_rq.TRAN_AMT) PAY_RQ_Money
from(
select trans.TERM_ID TERM_ID,
trans.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS trans
'
--再生资源 003
'
union all
select trans_his.TERM_ID TERM_ID,
trans_his.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS_HIS trans_his
'
--再生资源 003
'
) trans_pay_rq
group by trans_pay_rq.TERM_ID
)trans_pay_rq_l
on
trans_basic.APP_TERM_NO=trans_pay_rq_l.TERM_ID
left join(
-- 现金交易 取款
select
trans_cash_qk.TERM_ID TERM_ID,
) CASH_QK_Count,
sum(trans_cash_qk.TRAN_AMT) CASH_QK_Money
from(
select trans.TERM_ID TERM_ID,
trans.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS trans
'
union all
select trans_his.TERM_ID TERM_ID,
trans_his.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS_HIS trans_his
'
) trans_cash_qk
group by trans_cash_qk.TERM_ID
)trans_cash_qk_l
on
trans_basic.APP_TERM_NO=trans_cash_qk_l.TERM_ID
left join(
-- 现金交易 存款
select
trans_cash_ck.TERM_ID TERM_ID,
) CASH_CK_Count,
sum(trans_cash_ck.TRAN_AMT) CASH_CK_Money
from(
select trans.TERM_ID TERM_ID,
trans.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS trans
'
union all
select trans_his.TERM_ID TERM_ID,
trans_his.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS_HIS trans_his
'
) trans_cash_ck
group by trans_cash_ck.TERM_ID
)trans_cash_ck_l
on
trans_basic.APP_TERM_NO=trans_cash_ck_l.TERM_ID
left join(
-- 现金交易 查询
--余额查询1011001 查询交易明细1011002 积分查询 1011003
select
trans_cash_cx.TERM_ID TERM_ID,
) CASH_CX_Count
from(
select trans.TERM_ID TERM_ID
from SELFCUR.BIZ_MAIN_TRANS trans
'
union all
select trans_his.TERM_ID TERM_ID
from SELFCUR.BIZ_MAIN_TRANS_HIS trans_his
'
) trans_cash_cx
group by trans_cash_cx.TERM_ID
)trans_cash_cx_l
on
trans_basic.APP_TERM_NO=trans_cash_cx_l.TERM_ID
left join(
-- 现金交易 转账
select
trans_cash_zh.TERM_ID TERM_ID,
) CASH_ZH_Count,
sum(trans_cash_zh.TRAN_AMT) CASH_ZH_Money
from(
select trans.TERM_ID TERM_ID,
trans.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS trans
'
union all
select trans_his.TERM_ID TERM_ID,
trans_his.TRAN_AMT TRAN_AMT
from SELFCUR.BIZ_MAIN_TRANS_HIS trans_his
'
) trans_cash_zh
group by trans_cash_zh.TERM_ID
) trans_cash_zh_l
on
trans_basic.APP_TERM_NO=trans_cash_zh_l.TERM_ID
left join(
-- 补登折 存折
select
trans_budeng_cz.TERM_ID TERM_ID,
) BUDENG_CZ_Count
from(
select trans.TERM_ID TERM_ID
from SELFCUR.BIZ_MAIN_TRANS trans
'
union all
select trans_his.TERM_ID TERM_ID
from SELFCUR.BIZ_MAIN_TRANS_HIS trans_his
'
) trans_budeng_cz
group by trans_budeng_cz.TERM_ID
) trans_budeng_cz_l
on
trans_basic.APP_TERM_NO=trans_budeng_cz_l.TERM_ID  

Oracle中Union与Union All的区别(适用多个数据库)的更多相关文章

  1. Oracle中执行存储过程call和exec区别

    Oracle中执行存储过程call和exec区别 在sqlplus中这两种方法都可以使用: exec pro_name(参数1..); call pro_name(参数1..); 区别: 1. 但是e ...

  2. Oracle中Blob和Clob类型的区别与操作

    Oracle中Blob和Clob类型 1.Oracle中Blob和Clob类型的区别 BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的 ...

  3. Oracle中 (+)与left join 的用法区别

    Oracle中 (+)与left join 的用法区别 原创 2017年01月11日 13:33:42 6648 select * from a,b where a.id=b.id(+); (+)写在 ...

  4. Oracle中rank() over, dense_rank(), row_number() 的区别

    摘自:http://www.linuxidc.com/Linux/2015-04/116349.htm Oracle 中 rank() over, dense_rank(), row_number() ...

  5. Oracle中varchar,varchar2,nvarchar,nvarchar2的区别及其它数据类型描述

    --varchar,varchar2 联系: 1.varchar/varchar2用于存储可变长度的字符串 比如varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个 ...

  6. oracle中int类型和number类型区别

    INT类型是NUMBER类型的子类型.下面简要说明:(1)NUMBER(P,S)该数据类型用于定义数字类型的数据,其中P表示数字的总位数(最大字节个数),而S则表示小数点后面的位数.假设定义SAL列为 ...

  7. Oracle中Null与空字符串&#39; &#39;的区别

    含义解释: 问:什么是NULL? 答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零. ORACLE允许任何一种数据类型的字段为空,除 ...

  8. ORACLE 中rownum和row_number()的使用区别(可指定取sql结果集的第几个数据)

    这篇文章主要介绍了oracle中rownum和row_number()的使用方法以及区别和联系,十分的详细,有需要的小伙伴可以参考下.   row_number()over(partition by ...

  9. (转)在oracle中varchar和varchar2有什么区别?

    1.varchar2把所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节: 2.VARCHAR2把空串等同于null处理,而varchar仍 ...

  10. oracle中floor函数和to_number函数区别

     oracle中floor函数没有值默认是0,number函数没有值默认是空 

随机推荐

  1. HDU-1257 导弹拦截系统 http://acm.hdu.edu.cn/showproblem.php?pid=1257

    Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高 ...

  2. JavaScript中关于地址的获取

    //取当前页面名称(不带后缀名) function pageName(){ var a = location.href; var b = a.split("/"); var c = ...

  3. winform开发之UI系列

    1.如何构造一个漂亮的主窗体 主要讲述如何对一个新建窗体的美化过程,涉及到经常需要用到的几个属性我会着重强调它的用法,并不断更新它,因为楼主也正在探索中.... 步骤如下: vs新建一个winform ...

  4. ios-获取商店已上线app信息

    NSString *url = [[NSString alloc] initWithFormat:@"http://itunes.apple.com/lookup?id=%@",@ ...

  5. PHP数字格式化,每三位逗号分隔数字,可以保留小数

    在报价的时候为了给浏览者更清晰明确的数字,所以需要用到数字格式化,有两种方法,一种自己写函数,另一种当然是系统自带的,其实我更喜欢系统自带的. 先来系统简单的: string number_forma ...

  6. UItableview section和cell的局部刷新

    局部刷新//一个section刷新    NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2];    [tableview reloadS ...

  7. CentOS 7 服务器配置--安装MongoDB

    #下载MongoDB源文件: wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.7-tgz 注意:wget此处 ...

  8. 关于 BigDecimal处理float、double数据

    Big Decimal 在java中,对于float与double中的数据,总会因为精度问题而丢失数据的准确性,也就是说对于两者所处理的得到的值是无限接近于那个数,而并非一个精确数字,而对于电商中所涉 ...

  9. git中status指令总是提示内容被修改的解决

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近在用git提交项目修改时发现一个问题,就是多次 git a ...

  10. Logstash - Working with plugins(使用插件)

    本章节开始介绍logstash的插件及功能,插件对于logstash来说非常重要,按类别分为:input.filter.codec.output四种类型. logstash有非常丰富的插件,通过安装目 ...