oracle的多表合并查询-工作心得
本随笔文章,由个人博客(鸟不拉屎)转移至博客园
发布时间: 2018 年 11 月 29 日
原地址:https://niaobulashi.com/archives/oracle-select-all.html
刚刚开发需求写了个SQL,记个笔记,学习下关于数据库的多表合并查询的用法
select t.* from A t
UNION ALL/UNION/Intersect/MINUS
select s.* from B s;
UNION ALL

使用UNION ALL,表示取A、B的合集,不过滤重复的数据行
UNION

使用UNION,会将结果集A和结果集B进行UNION ALL运算,然后取两者交集的余集作为结果集
Intersect

使用Intersect,会将结果集A和结果集B进行UNION ALL运算,然后两者之间的集交集作为结果集和UNION刚好相反
MINUS

使用MINUS,取结果集A减去结果集B留下的差集,注:如果结果集A小于等于结果集B,返回空结果集.
好啦,下面进入实战阶段,我就直接将我写的SQL贴出来吧
select a.*
from (select t.c_fund_account_name as "fundAccountNo", --基金账号
tfp.project_code as "projectCode", --项目编号
tfp.project_name as "projectName", --项目名称
tfp.project_shortname as "projectShortName", --项目简称
c.c_fund_name as "fundName", --基金产品名称
c.c_fund_code as "fundCode", --基金产品代码
nvl(thold.subsistAssetsShare, 0) as "subsisAssetsShare", --份额(家族)
to_char(thold.updateDate, 'yyyy-MM-dd') as "updateDate", --日期
nvl(c.c_current_share, 0) as "currentShare", --份额(基金网站)
to_char(c.d_date, 'yyyy-MM-dd') as "dateDate", --日期
(nvl(thold.subsistAssetsShare, 0) - nvl(c.c_current_share, 0)) as "diffValue", --差值
CAST((CASE
WHEN (nvl(thold.subsistAssetsShare, 0) -
nvl(c.c_current_share, 0)) = 0 THEN
'1'
WHEN (nvl(thold.subsistAssetsShare, 0) -
nvl(c.c_current_share, 0)) <> 0 THEN
'0'
END) as nvarchar2(2)) as "identical" --是否一致
from t_fund_account t
inner join (select fhs.*,
row_number() over(partition by fhs.c_fund_account_no, fhs.c_project_code order by fhs.d_date desc) rn
from td_fund_holding_share fhs) c
on t.c_fund_account_name = c.c_fund_account_no
and t.c_project_code = c.c_project_code
LEFT JOIN (SELECT tha.project_code as projectCode,
sum(tha.current_share) as subsistAssetsShare, -- 持有份额
sum(tha.current_cost) as currentCost, --当前成本
sum(tha.accumulated_profit) as accumulatedProfit, --累积利润
max(tha.update_time) as updateDate
FROM t_hold_assets tha
left join t_polling_product p
on tha.c_product_code = p.c_product_code
WHERE 1 = 1
and tha.delete_flag = '0'
and p.c_stock_type_level1 = '0'
and p.c_stock_type_level2 = '01'
GROUP BY tha.project_code) thold
on thold.projectCode = t.c_project_code
left join t_family_project tfp
on tfp.project_code = t.c_project_code
and tfp.delete_flag = '0'
where rn = 1
AND t.c_fund_account_type = '1' --基金账户
AND t.delete_flag = '0'
UNION ALL
select t.c_fund_account_name as "fundAccountNo", --基金账号
tfp.project_code as "projectCode", --项目编号
tfp.project_name as "projectName", --项目名称
tfp.project_shortname as "projectShortName", --项目简称
CAST('' as nvarchar2(50)) as "fundName", --基金产品名称
CAST('' as nvarchar2(50)) as "fundCode", --基金产品代码
nvl(thold.subsistAssetsShare, 0) as "subsisAssetsShare", --份额(家族)
to_char(thold.updateDate, 'yyyy-MM-dd') as "updateDate", --日期
to_number(nvl('', 0)) as "currentShare", --份额(基金网站)
to_char(CAST('' as nvarchar2(50)), 'yyyy-MM-dd') as "dateDate", --日期
nvl(thold.subsistAssetsShare, 0) - nvl('', 0) as "diffValue", --差值
CAST((CASE
WHEN (nvl(thold.subsistAssetsShare, 0) - nvl('', 0)) = 0 THEN
'1'
WHEN (nvl(thold.subsistAssetsShare, 0) - nvl('', 0)) <> 0 THEN
'0'
END) as nvarchar2(2)) as "identical" --是否一致
from t_fund_account t
LEFT JOIN (SELECT tha.project_code as projectCode,
sum(tha.current_share) as subsistAssetsShare, -- 持有份额
max(tha.update_time) as updateDate
FROM t_hold_assets tha
left join t_polling_product p
on tha.c_product_code = p.c_product_code
WHERE 1 = 1
and tha.delete_flag = '0'
and p.c_stock_type_level1 = '0'
and p.c_stock_type_level2 = '01'
GROUP BY tha.project_code) thold
on thold.projectCode = t.c_project_code
left join t_family_project tfp
on t.c_project_code = tfp.project_code
and tfp.delete_flag = '0'
where t.c_fund_account_name not in
(select td.c_fund_account_no from td_fund_holding_share td)
and t.c_fund_account_type = '1'
and t.delete_flag = '0') a
order by a."diffValue" desc, a."projectCode" desc
上面sql具体意思是:查询出基金信息,A和基金对比先查询其中有的数据,再union all A有基金没有的数据,一起取个并集。OK,需求完成
哈哈哈哈,其实只要你SQL写得牛逼,然后了解下业务流程,什么都好说哈哈哈
哦对了,最后啰嗦一句。 对于这些并集计算之后,需要排序 则语法为:
select t.* from (语句1 union all 语句2)
t order by t.id;

oracle的多表合并查询-工作心得的更多相关文章
- SQL多表合并查询结果
两表合并查询,并同时展示及分页SELECT a.* FROM ( ( SELECT punycode, `domain`, 'Success' AS state, add_time, AS refun ...
- Oracle 表复杂查询之多表合并查询
转自:https://www.cnblogs.com/GreenLeaves/p/6635887.html 本文使用到的是oracle数据库scott方案所带的表,scott是oracle数据库自带的 ...
- mysql——多表——合并查询结果
合并查询结果 合并查询结果 是将多个select语句的查询结果合并到一起 union关键字,数据库会将所有的查询结果合并到一起,然后除掉相同的记录: union all关键字,只是简单的合并到一起 前 ...
- ORACLE数据库多表关联查询效率问题解决方案
最近在做项目中遇到多表关联查询排序的效率问题(5张以上40W+数据的表),查询一次大概要20多秒,经过一番苦思冥想,处理方案如下: 1.软件设计初期,需要一对一关联的表应该设计在一张大表里,这样虽然字 ...
- 一条sql,有分页,表合并查询,多表连接,用于oracle数据库
SELECT * FROM ( SELECT TT.*,ROWNUM RN FROM ( SELECT A.CASE_ID AS TREATID, A.TYPE AS TYPE, B.CONTENT ...
- ORACLE EBS常用表及查询语句(最终整理版)
建议去看参考二 参考一: call fnd_global.APPS_INITI ...
- SQL 两张结构一样的表合并查询 .
select * from table1 union all select * from table2 union all 是所有的都显示出来: select * from table1 union ...
- Oracle数据库锁表的查询方法以及解锁的方法
1,锁表语句简单查询方法 select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session ...
- oracle数据库数据库表空间查询及扩充
1.查询表空间,及表空间的大小 SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size FROM dba_tabl ...
随机推荐
- [转]JMX的Hello World
这篇写的很详尽了: http://www.blogjava.net/hengheng123456789/articles/65690.html
- iOS 开源库系列 Aspects核心源码分析---面向切面编程之疯狂的 Aspects
Aspects的源码学习,我学到的有几下几点 Objective-C Runtime 理解OC的消息分发机制 KVO中的指针交换技术 Block 在内存中的数据结构 const 的修饰区别 block ...
- cocos2d-x3.0 柱图
画柱图就是多画几个矩形之后放在一起,这个实现了基本功能还不够完好假设要用到项目中须要自己改动. 原文地址:http://blog.csdn.net/qqmcy/article/details/2598 ...
- mybatis #{}和${}的区别是什么
#{}和${}的区别是什么?正确的答案是:#{}是预编译处理,${}是字符串替换.(1)mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法 ...
- 【模板】deque实现单调队列
双端队列deque容器: 关于deque最常用的有这几个函数: 都是成员函数 双端队列模板题:[洛谷]P2952 [USACO09OPEN]牛线Cow Line #include<iostrea ...
- CURL的学习和应用
curl安装: xp下面的安装 :修改php.ini文件的设置,找到php_curl.dll //取消下在的注释extension=php_curl.dll linux下面安装: # wget htt ...
- Js 面向对象之封装,继承,原型,原型链
封装 ,继承 ,原型, 原型链 封装 ? 面向对象有三大特性,封装.继承和多态.对于ES5来说,没有class(类)的概念,并且由于JS的函数级作用域(函数内部的变量在函数外访问不到),所以我们就可以 ...
- 9、Android---UI---Material Design
9.1.什么是Material Design 由谷歌的设计师基于传统优秀设计原则,结合丰富的创意和科学技术所发明的一套全新的界面设计语言 包含了视觉.运行.互动等效果 Material Design的 ...
- 译:ORCFILE IN HDP 2:更好的压缩,更高的性能
原文地址: https://hortonworks.com/blog/orcfile-in-hdp-2-better-compression-better-performance/ ORCFILE I ...
- 初识Qt简单动画
Qt提供了类QPropertyAnimation来实现图片的一些简单的动画操作效果. 1.新建一个Qt空项目,同时添加资源文件,并在资源文件中添加图片路径.之后在main.cpp函数中添加以下代码 # ...