标量子查询中有ROWNUM=1怎么改?
碰到标量子查询中有ROWNUM=1怎么改?
select to_date(o.postdate,'yyyymmdd'),
(select cur.c_code from cur_tbl cur where cur.c_abbr=o.currencycode) as CusNo,
o.dramount,
round(o.dramount *
(select s.exechangerate / 100
from tcsa.uccexchange s
where s.exchangecurrency =
(SELECT T.t_code
FROM tcsa.sap_code_mapping t
where t.typename = 'currency'
and T.sap_code = o.currencycode)
and TO_CHAR(s.issuancedate, 'yyyymmdd') = o.postdate
and rownum = 1),2) AS Debit_Sum_RMB,
o.cramount,
round(o.cramount *
(select s.exechangerate / 100
from tcsa.uccexchange s
where s.exchangecurrency =
(SELECT T.t_code
FROM tcsa.sap_code_mapping t
where t.typename = 'currency'
and T.sap_code = o.currencycode)
and TO_CHAR(s.issuancedate, 'yyyymmdd') = o.postdate
and rownum = 1),2) AS Credit_Sum_RMB
from tcsa.mm_sap_voucher_detail_to o
where o.postdate >= '20170101'
and o.postdate < '20180101' ;
Plan hash value: 1961056669
-------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Inst |IN-OUT|
-------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1210K| 639M| | 153K (1)| 00:30:48 | | |
|* 1 | TABLE ACCESS FULL | CUR_TBL | 1 | 12 | | 3 (0)| 00:00:01 | | |
|* 2 | COUNT STOPKEY | | | | | | | | |
|* 3 | FILTER | | | | | | | | |
|* 4 | VIEW | | 31006 | 2240K| | 778 (1)| 00:00:10 | | |
|* 5 | WINDOW SORT PUSHED RANK| | 31006 | 2815K| 6632K| 778 (1)| 00:00:10 | | |
| 6 | REMOTE | UCCEXCHANGE | 31006 | 2815K| | 111 (1)| 00:00:02 | CLONE | R->S |
| 7 | REMOTE | SAP_CODE_MAPPING | 1 | 240 | | 2 (0)| 00:00:01 | CLONE | R->S |
|* 8 | COUNT STOPKEY | | | | | | | | |
|* 9 | FILTER | | | | | | | | |
|* 10 | VIEW | | 31006 | 2240K| | 778 (1)| 00:00:10 | | |
|* 11 | WINDOW SORT PUSHED RANK| | 31006 | 2815K| 6632K| 778 (1)| 00:00:10 | | |
| 12 | REMOTE | UCCEXCHANGE | 31006 | 2815K| | 111 (1)| 00:00:02 | CLONE | R->S |
| 13 | REMOTE | SAP_CODE_MAPPING | 1 | 240 | | 2 (0)| 00:00:01 | CLONE | R->S |
| 14 | REMOTE | MM_SAP_VOUCHER_DETAIL_TO | 1210K| 639M| | 153K (1)| 00:30:48 | CLONE | R->S |
-------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("CUR"."C_ABBR"=SYS_OP_C2C(:B1))
2 - filter(ROWNUM=1)
3 - filter("EXCHANGECURRENCY"= (SELECT /*+ */ "T"."t_code" FROM "A2" WHERE "T"."TYPENAME"='currency' AND
"T"."SAP_CODE"=:B1))
4 - filter(TO_CHAR("ISSUANCEDATE",'yyyymmdd')=:B1 AND "RN"=1)
5 - filter(ROW_NUMBER() OVER ( PARTITION BY "T_RMB"."BASECURRENCY","T_RMB"."EXCHANGECURRENCY",TO_DATE(TO_CHAR(INTERN
AL_FUNCTION("T_RMB"."ISSUANCEDATE"),'yyyymmdd'),'yyyymmdd') ORDER BY "STATUS")<=1)
8 - filter(ROWNUM=1)
9 - filter("EXCHANGECURRENCY"= (SELECT /*+ */ "T"."t_code" FROM "A2" WHERE "T"."TYPENAME"='currency' AND
"T"."SAP_CODE"=:B1))
10 - filter(TO_CHAR("ISSUANCEDATE",'yyyymmdd')=:B1 AND "RN"=1)
11 - filter(ROW_NUMBER() OVER ( PARTITION BY "T_RMB"."BASECURRENCY","T_RMB"."EXCHANGECURRENCY",TO_DATE(TO_CHAR(INTERN
AL_FUNCTION("T_RMB"."ISSUANCEDATE"),'yyyymmdd'),'yyyymmdd') ORDER BY "STATUS")<=1)
看到这种不加排序的子句直接使用rownum=1的查询,本身就是对数据要求不严格。所以只要达到它的一个特性(最多返回一行)就可以,上面的标量语句就可以改为:
(select max(s.exechangerate) exechangerate,
s.exchangecurrency,
TO_CHAR(s.issuancedate, 'yyyymmdd') issuancedate1
from tcsa.uccexchange s
group by TO_CHAR(s.issuancedate, 'yyyymmdd'),s.exchangecurrency)
整体改写后:
select postdate, CusNo, dramount, Debit_Sum_RMB, cramount, Credit_Sum_RMB
from (select to_date(o.postdate, 'yyyymmdd') postdate,
cur.c_code as CusNo,
o.dramount,
round(o.dramount * (s.exechangerate1 / 100), 2) AS Debit_Sum_RMB,
o.cramount,
round(o.cramount * (s.exechangerate1 / 100), 2) AS Credit_Sum_RMB,
s.exchangecurrency,
t.t_code
from tcsa.mm_sap_voucher_detail_to o
left join cur_tbl cur
on cur.c_abbr = o.currencycode
left join (select max(exechangerate) exechangerate1,
exchangecurrency,
TO_CHAR(issuancedate, 'yyyymmdd') issuancedate1
from tcsa.uccexchange
group by exchangecurrency,
TO_CHAR(issuancedate, 'yyyymmdd')) s
on s.issuancedate1 = o.postdate
left join tcsa.sap_code_mapping t
on t.typename = 'currency'
and t.sap_code = o.currencycode
where o.postdate >= '20170101'
and o.postdate < '20180101') tab
where t_code = exchangecurrency;
标量子查询中有ROWNUM=1怎么改?的更多相关文章
- 优化有标量子查询的SQL
数据库环境:SQL SERVER 2008R2 今天在数据库中抓出一条比较耗费资源的SQL,只返回904条数据,居然跑了40多分钟.SQL及对应的数据量如下图: SELECT saft04.cur_y ...
- [20180626]函数与标量子查询14.txt
[20180626]函数与标量子查询14.txt --//前面看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到: 通俗来将,当使用标量子查 ...
- not子查询中有null值的时候 not in 会失效
not in子查询中有null值的时候 not in 会失效 但是 in 的子查询中有null的 不会失效
- Oracle sql优化之分析函数优化标量子查询
待优化语句如下 select a.code as code, a.m_code as m_code,a.stktype as f_stype,a.e_year as e_year, b.sname a ...
- SQL Server的优化器会缓存标量子查询结果集吗
在这篇博客"ORACLE当中自定义函数性优化浅析"中,我们介绍了通过标量子查询缓存来优化函数性能: 标量子查询缓存(scalar subquery caching)会通过缓存结果减 ...
- SELECT列表中的标量子查询
发现了一种表连接新的写法,以前还没有这样写过或者见别人写过.跟同学聊天他们公司却很多人这样写,看来真的要学学sql了 表 CREATE TABLE `t_book` ( `FId` ) NOT NUL ...
- WHERE 子句中的标量子查询
标量子查询不仅可以用在SELECT 语句的列表中,它还可以用在WHERE 子句中,而且实际应用中子查询很多的时候都是用在WHERE子句中的. 先来看一个简单的例子,我们要检索喜欢“Story”的读者主 ...
- 在MySQL中使用子查询和标量子查询的基本用法
一.MySQL 子查询 子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用.MySQL 支持 SQL 标准要求的所有子查询格式和操作,也扩展了特有的几种特性.子查询没 ...
- 彻底搞懂oracle的标量子查询
oracle标量子查询和自己定义函数有时用起来比較方便,并且开发者也常常使用.数据量小还无所谓.数据量大,往往存在性能问题. 下面測试帮助大家彻底搞懂标量子查询. SQL> create tab ...
随机推荐
- bzoj 303: [CQOI2009]中位数图【前缀和+瞎搞】
处理出一个序列c,a[i]>b,c[i]=1;a[i]==b,c[i]=0;a[i]<b,c[i]=-1,然后s为c的前缀和,设w为b在a序列里的下标 注意到子序列一定横跨w,并且一个符合 ...
- bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin【线段树+最大费用最大流】
--因为T点忘记还要+n所以选小了所以WA了一次 注意!题目中所给的时间是一边闭一边开的区间,所以读进来之后先l++(或者r--也行) 线段树优化建图,很神.(我记得还有个主席树优化建树的?)首先考虑 ...
- CF915E Physical Education Lessons(珂朵莉树)
中文题面 据说正解是动态开点线段树而且标记也不难下传的样子 然而这种区间推平的题目还是喜欢写珂朵莉树啊……码量小…… 虽然真要构造的话随便卡…… //minamoto #include<cstd ...
- 深入学习Ajax
1.什么是Ajax? AJAX的全称是Asynchronous Javascript And XML (异步的JavaScript和XML).是一种在无需重新加载整个网页的情况下,能够更新部分网页的技 ...
- 数字货币期货与现货JavaScript量化策略代码详解汇总
1.动态平衡策略 按照当前的 BTC 的价值,账户余额保留¥5000 现金和 0.1个 BTC,即现金和BTC 市值的初始比例是 1:1. 如果 BTC 的价格上涨至¥6000,即 BTC 市值大于账 ...
- JAVA 毕业设计 辅导
JAVA 毕业设计 辅导 =======================================================
- IE6,7bug大搜集
断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面记录下来了!希望以后解决类似问题的时候能够快速解决 ,也希望大家能在留言里面跟进自己发现的ie6 7 8bug和解决办法! 1 ...
- UML 活动图(转载)
活动图:用于表示系统中各种活动的次序,它的应用非常广泛,即可用来描述用例的工作流程,也可用来描述类中某个方法的操作行为.常用于表示业务流程,对系统功能建模,强调对象之间的控制流.活动图是由状态图变化而 ...
- 微软2017年预科生计划在线编程笔试 A Legendary Items
思路: 获得第i(i = 0, 1, ..., n - 1)件物品的概率仅由公式p / (1 << i)决定,所以获得这i件物品之间是相互独立的.迭代计算获得所有i件物品的期望再求和即可. ...
- 关于Android软键盘把布局顶上去的问题(一)
最近接触到了一个登陆页面,布局最上面显示的是一个波纹的view,中间显示账号和密码的EditText,紧接着还有一个Button: 希望:点击EditText时,软键盘不能把波纹的view顶出去,也不 ...