碰到标量子查询中有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怎么改?的更多相关文章

  1. 优化有标量子查询的SQL

    数据库环境:SQL SERVER 2008R2 今天在数据库中抓出一条比较耗费资源的SQL,只返回904条数据,居然跑了40多分钟.SQL及对应的数据量如下图: SELECT saft04.cur_y ...

  2. [20180626]函数与标量子查询14.txt

    [20180626]函数与标量子查询14.txt --//前面看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到: 通俗来将,当使用标量子查 ...

  3. not子查询中有null值的时候 not in 会失效

    not in子查询中有null值的时候 not in 会失效 但是 in 的子查询中有null的 不会失效

  4. 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 ...

  5. SQL Server的优化器会缓存标量子查询结果集吗

    在这篇博客"ORACLE当中自定义函数性优化浅析"中,我们介绍了通过标量子查询缓存来优化函数性能: 标量子查询缓存(scalar subquery caching)会通过缓存结果减 ...

  6. SELECT列表中的标量子查询

    发现了一种表连接新的写法,以前还没有这样写过或者见别人写过.跟同学聊天他们公司却很多人这样写,看来真的要学学sql了 表 CREATE TABLE `t_book` ( `FId` ) NOT NUL ...

  7. WHERE 子句中的标量子查询

    标量子查询不仅可以用在SELECT 语句的列表中,它还可以用在WHERE 子句中,而且实际应用中子查询很多的时候都是用在WHERE子句中的. 先来看一个简单的例子,我们要检索喜欢“Story”的读者主 ...

  8. 在MySQL中使用子查询和标量子查询的基本用法

    一.MySQL 子查询 子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用.MySQL 支持 SQL 标准要求的所有子查询格式和操作,也扩展了特有的几种特性.子查询没 ...

  9. 彻底搞懂oracle的标量子查询

    oracle标量子查询和自己定义函数有时用起来比較方便,并且开发者也常常使用.数据量小还无所谓.数据量大,往往存在性能问题. 下面測试帮助大家彻底搞懂标量子查询. SQL> create tab ...

随机推荐

  1. appium封装显示等待Wait类和ExpectedCondition接口

    此文已由作者夏鹏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 使用WebDriver做Web自动化的时候,org.openqa.selenium.support.ui中提供 ...

  2. bzoj 1096: [ZJOI2007]仓库建设【斜率优化】

    好眼熟啊 直接dp显然很难算,所以设val为只在n点建一个仓库的费用,然后设f[i]为在i~n点建若干仓库并且i点一定建一个仓库的最大省钱数 转移很显然,设s为p的前缀和,f[i]=max{f[j]+ ...

  3. 关于element-ui的diallog拖动的实现

    先给下载地址 https://files.cnblogs.com/files/maruihua/el-dragDialog.rar 需要注意的是如果给模态框加入拖动指令,一些定位样式会出问题,需谨慎 ...

  4. Linux之旅第一篇-目录结构及操作目录

    一.引言 Linux对java开发来说也是一项必备的技能,因为项目基本都是部署在Linux操作系统的服务器中,虽然项目不一定需要我们去部署,但不管是自己测试环境部署,还是一些生产环境中日志的查看,Li ...

  5. 进击的Python【第十五章】:Web前端基础之DOM

    进击的Python[第十五章]:Web前端基础之DOM 简介:文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示 ...

  6. python开发基础教程

    第一:python基础 第二:python异常处理类 第三:python装饰器  python常用的装饰器 第四:python发送邮件

  7. Android推送服务(2)微信智能心跳方案

    http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207243549&idx=1&sn=4ebe4beb8123f1b5 ...

  8. vue watch监听对象及对应值的变化

    data:{ a:1, b:{ value:1, type:1, } }, watch:{ a(val, oldVal){//普通的watch监听 console.log("a: " ...

  9. android开发学习——关于activity 和 fragment在toolbar上设置menu菜单

    在做一个项目,用的是Android Studio 系统的抽屉源码,但是随着页面的跳转,toolbar的title需要改变,toolbar上的menu菜单也需要改变,在网上找了好久,也尝试了很多,推荐给 ...

  10. C# 代码笔记_tuple元组

    tuple元组: 赋值 List<Tuple<string, int>> cc = new List<Tuple<string, int>>() { n ...