碰到标量子查询中有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. Vijos P1951 玄武密码 (AC自动机)

    描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在 ...

  2. bzoj 1502 月下柠檬树【Simpson积分】

    投影到地面之后,会发现圆形在平行光下面积和形状是不会变的,也就是所要求的图形是若干个圆和把相邻两个圆连起来的公切线所组成的. 公切线和圆间距瞎求一下就行,注意要去掉被完全覆盖的圆 然后simpson即 ...

  3. linux php5.6 提示 could not find driver

    1.进入在PHP源码包中进入ext/pdo_mysql # wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz 2.然后是解压缩. # tar -zxvf ...

  4. Hdu 4465 Candy (快速排列组合+概率)

    题目链接: Hdu 4465 Candy 题目描述: 有两个箱子,每个箱子有n颗糖果,抽中第一个箱子的概率为p,抽中另一个箱子的概率为1-p.每次选择一个箱子,有糖果就拿走一颗,没有就换另外一个箱子. ...

  5. Hdu 3488 Tour (KM 有向环覆盖)

    题目链接: Hdu 3488 Tour 题目描述: 有n个节点,m条有权单向路,要求用一个或者多个环覆盖所有的节点.每个节点只能出现在一个环中,每个环中至少有两个节点.问最小边权花费为多少? 解题思路 ...

  6. 找规律/贪心 Codeforces Round #310 (Div. 2) A. Case of the Zeros and Ones

    题目传送门 /* 找规律/贪心:ans = n - 01匹配的总数,水 */ #include <cstdio> #include <iostream> #include &l ...

  7. 暴力 hihoCoder 1178 计数

    题目传送门 /* 暴力:这题真是醉了,直接暴力竟然就可以了!复杂度不会分析,不敢写暴力程序.. 枚举x,在不重复的情况下+ans,超过范围直接break */ #include <cstdio& ...

  8. Java几种常见的排序方法

    日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一 ...

  9. JAVA300集笔记

    章节2 java入门阶段 2.1注释 单行注释 //  多行注释 /* 内容*/ 文本注释/**内容*/ 注释是为了方便阅读代码,在编译时注释会被删除. 2.2 标识符 标识符作用: 标识符用来给变量 ...

  10. poj3050 Hopscotch

    思路: 水题. 实现: #include <iostream> #include <cstdio> #include <set> using namespace s ...