sql语句的简化(r2第7天)

今天碰到一个sql语句简化的问题,虽然也不复杂,但是也值得从中学习一些东西

SELECT MOD(((SELECT TO_NUMBER(TO_CHAR(LOGICAL_DATE, 'YYYY'))
               FROM SMALL_TAB
              WHERE LOGICAL_DATE_TYPE = 'R'
                AND EXPIRATION_DATE IS NULL) * 365 +
           (SELECT TO_NUMBER((SELECT LOGICAL_DATE
                                 FROM SMALL_TAB
                                WHERE LOGICAL_DATE_TYPE = 'R'
                                  AND EXPIRATION_DATE IS NULL) -
                              TRUNC(SYSDATE, 'YYYY'))
               FROM DUAL)) + 1,
           (SELECT NVL(PARAMETER_VALUE+1,366)FROM SMALL_TAB2
                                 WHERE PARAMETER_NAME = 'DAY_PAR')                     
  FROM DUAL

我得到了这样一个sql语句,但是猛一看sql语句里面包含了不少dual。 这样的sql语句是比较臃肿的,感觉需要做一些工作来改动,首先就是需要明确需求,开发想实现什么样的功能,然后在保证结果集准确的前提下来进行简化工作。 大体上沟通以后,sql语句的实现功能类似下面的形式 SELECT MOD((2014 * 365 + (165)) + 1, 366) FROM DUAL 其实就是计算当前的年份,然后得到对应的天数和当年一月一日以来的天数。 在此基础上做计算得到一个对应的key 简单调整后,就成了下面的样子,把多余的dual全都去掉了。在测试中比较发现,对应的逻辑读一下子从128降低到了64,相应时间也有了一定的提升。

select mod(
            (SELECT TO_NUMBER(TO_CHAR(LOGICAL_DATE, 'YYYY')) * 365 +
                  TO_NUMBER(LOGICAL_DATE - TRUNC(SYSDATE, 'YYYY')) + 1
             FROM SMALL_TAB
            WHERE LOGICAL_DATE_TYPE = 'R'
              AND EXPIRATION_DATE IS NULL),
           (SELECT NVL(PARAMETER_VALUE + 1, 366)
              FROM SMALL_TAB2
             WHERE PARAMETER_NAME = 'DAY_PAR')
           )
  from dual;

其实性能的提升不够明显,但是简单清晰的sql语句,在日常的维护中也能省不少心。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-06-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Aloys的开发之路

DB2常用语句

CREATE TABLE STAFF_BAK LIKE STAFF; INSERT INTO STAFF_BAK SELECT * FROM STAFF; S...

1795
来自专栏ASP.NET MVC5 后台权限管理系统

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(15)-权限管理系统准备

这节我们说下权限系统的特点,本系统采用的是MVC4+EF5+IOC 接口编程的架构,其中的权限树用的是DWTree,功能上做到灵活,授权操控细致,权限可以细到按...

2115
来自专栏数据之美

一些sql用法例子【Updating】

1、利用instr连接表做字段查询,group_concat做值的合并: create table ab(product_id int,product_name...

2266
来自专栏数据库新发现

Oracle的X$表系列介绍之-X$KSLLCLASS

« HRAY纳斯达克的IPO历程 | Blog首页 | Windows Xp中如何设置自动登录 »

863
来自专栏简书专栏

mysql实训

设有一个数据库,包括四个表:学生表(student)、课程表(course)、成绩表(score)以及教师信息表(teacher)。用SQL语句创建四个表并完成...

781
来自专栏landv

SQL得到任意一个存储过程的参数列表sp_procedure_params_rowset

1422
来自专栏james大数据架构

你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(下)

你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接、外连接 你真的会玩SQL吗?三范式、数据完整性 你真...

1816
来自专栏Jed的技术阶梯

Hive案例01-行列转换

其中字段意义: id(int) sid(int) subject(string) score(int) 分别代表: 本条记录的ID 学生ID 科...

561
来自专栏简书专栏

mysql实训2

查询日期为2011-04-05这一天进行过存款的客户ID、客户姓名、银行名称、存款金额。

752
来自专栏杨建荣的学习笔记

MySQL自增列主从不一致的测试(r12笔记第37天)

MySQL里面有一个问题尤其值得注意,那就是自增列的重复值问题,之前也简单分析过一篇MySQL自增列的重复值问题(r12笔记第25天),但是在后续我想了...

2645

扫码关注云+社区