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 ...
随机推荐
- 【转载】Spring最佳后台框架
https://www.quora.com/What-is-the-best-backend-arquitecture-using-spring-framework The most modern a ...
- 3223. 文艺平衡树【平衡树-splay】
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 ...
- docker 导入导出镜像
docker容器导入导出有两种方法: 一种是使用save和load命令 使用例子如下: docker save ubuntu:load>/root/ubuntu.tar docker load& ...
- 初识Qt图片显示、平移及旋转
1.新建一个Qt Gui应用,项目名称为myPicture,基类选择为QMainWindow,类名设置为MainWindow. 2.在mainwindow.h头文件中添加void paintEvent ...
- Srv数据格式
1.简介 类似msg文件, srv文件是用来描述服务( service数据类型的, service通信的数据格式定义在*.srv中. 它声明了一个服务, 包括请求(request)和响应( reply ...
- package结构
1.package结构 一个package下常见的文件. 路径有:├── CMakeLists.txt #package的编译规则(必须)├── package.xml #package的描述信息(必 ...
- http协议cookie结构分析
Http协议中Cookie详细介绍 Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie.内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失 ...
- 算法练习——最长公共子序列的问题(LCS)
问题描述: 对于两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列.X Y 各自字符串有顺序,但是不一定需要相邻. 最长公共子串(Longest Common Subst ...
- Mac环境下安装配置Hadoop伪分布式
伪分布式需要修改5个配置文件(hadoop2.x的配置文件$HADOOP_HOME/etc/hadoop) 第一个:hadoop-env.sh #vim hadoop-env.sh #第25行,由于新 ...
- 倒计数锁存器(CountDown Latch)和 CyclicBarrier(同步屏障)
倒计数锁存器(CountDown Latch)是异常性障碍,允许一个或多个线程等待一个或者多个其他线程来做某些事情. public static long time(Executor executor ...