标量子查询中有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 ...
随机推荐
- HDU 2914 Triangle (Fibnacci 数)
题意:给你一个长度为 n 的木棒,求至少拿掉几根使得剩余的木棒构成不了三角形. 析:为了保证不形成三角形,所以保证两边之和等于最大边是最优,这不就是Fibnacci 数么,由于 n 很小,if-els ...
- python中lambda函数的笔记
学习网址为:https://foofish.net/lambda.html 通过lambda来定义一个匿名的函数,该匿名函数冒号前面的为函数传入值,冒号后面跟着的就是函数表达式. 例: lambda ...
- php pdo操作数据库
POD扩展是在PHP5中加入,该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题. PDO的特点: 性能.PDO 从一开始就吸取了现有数据库扩展成 ...
- JavaScript 数组相关基础方法
文章来源于:https://www.cnblogs.com/dolphinX/p/3353590.html 创建数组 构造函数 1.无参构造函数,创建一空数组 var a1=new Array(); ...
- 一个 Java 对象到底有多大?
阅读本文大概需要 2.8 分钟. 出处:http://u6.gg/swLPg 编写 Java 代码的时候,大多数情况下,我们很少关注一个 Java 对象究竟有多大(占据多少内存),更多的是关注业务与逻 ...
- Ubuntu 18 开机后直接进入命令行界面,没法进入桌面
应该是之前不知道干啥,删了gnome的一个东西,导致没法正常进入 暴力解决,直接重装桌面环境 sudo apt install ubuntu-desktop
- Centos 7 chrome
share from https://www.cnblogs.com/lenmom/p/9195581.html 1. 下载Chrome浏览器的rpm包 https://www.chrome64bit ...
- mysql快捷命令
# mysql快捷命令alias mysqlstart='sudo /usr/local/mysql/support-files/mysql.server start'alias mysqlstop= ...
- [转]访问 OData 服务 (WCF Data Services)
本文转自:http://msdn.microsoft.com/zh-SG/library/dd728283(v=vs.103) WCF 数据服务 支持开放式数据协议 (OData) 将数据作为包含可通 ...
- asp.net网站接入QQ登录
这两天在做网站第三方登录,总结一下QQ登录吧,支付宝就不用了(下载dome把ID什么的换一换就基本可以了.),本文主要说的是代码的实现方式,逻辑部分主要还是根据帮助文档来的.不懂的同学可以先看看文档. ...