zoukankan      html  css  js  c++  java
  • oracle数据库优化与LNNVL函数使用

    一:先谈谈数据库的优化

          1. max 函数 运行速率慢;现在用下面的方式替换

              A;用max函数的方式;获取最新操作时间的 一行员工记录-----------速度慢;

               select *
                 from JCT_EMPLID_RECORD@JEHR JER
                 WHERE JER.TYPE = '员工银行卡信息记录'
                           AND JER.CREATEDATE = (SELECT MAX(CREATEDATE)
                                   FROM JCT_EMPLID_RECORD@JEHR
                                      WHERE TYPE = '员工银行卡信息记录'
                                       AND EMPLID = JER.EMPLID
                               )

               B;不用max函数的方式: ---------------

                  SELECT *
                      FROM jct_emplid_record@jehr jer
                      WHERE jer.type = '员工银行卡信息记录'
                      AND NOT EXISTS (SELECT 'X'              //X这里是随意的 可以是任何值   这里的逻辑就是  不存在 比 temp的创建日期大于jer的创建日期;这就是要 jer里的日期是最新的
                           FROM jct_emplid_record@jehr temp
                              WHERE temp.type = jer.type
                                AND temp.emplid = jer.emplid
                                AND temp.createdate > jer.createdate)

        

        二 :左连接的新写法

               SELECT jer.emplid,
           pn.name,
           to_char(jer.createdate, 'yyyy-mm-dd') createdate,
           pb.account_ec_id,
           ppn.national_id nid
      FROM jct_emplid_record@jehr jer,
           sysadm.ps_pye_bankacct pb,
           sysadm.ps_pers_nid ppn,
           (SELECT ps.emplid, ps.name
              FROM sysadm.ps_names ps
             WHERE NOT EXISTS (SELECT 'X'
                      FROM sysadm.ps_names ps1
                     WHERE ps1.emplid = ps.emplid
                       AND ps1.effdt > ps.effdt)) pn
     WHERE 1 = 1
       AND jer.emplid = ppn.emplid
       AND jer.emplid = pb.emplid(+)    //左连接
       AND jer.emplid = pn.emplid(+)   //左连接
       AND NOT EXISTS
     (SELECT 'X'
              FROM jct_emplid_record@jehr temp
             WHERE temp.type = jer.type
               AND temp.emplid = jer.emplid
               AND temp.createdate > jer.createdate)
       AND jer.type = '员工银行卡信息记录'
       AND ppn.national_id_type = 'NID'
       AND jer.createdate >= to_date('2015-03-01', 'yyyy-mm-dd')
       AND jer.createdate <= to_date('2015-04-10', 'yyyy-mm-dd')
     ORDER BY jer.emplid

    三 :LNNVL函数

       LNNVL官方解释翻译
         lnnvl用于某个语句的where子句中的条件,如果条件为true就返回false;如果条件为UNKNOWN或者false就返回true。该函数不能用于复合条件如AND, OR, or BETWEEN中。

    几种情况测试说明

    --年份小于2009(lnnvl表示年份大于或者2009包含null)
    SQL> select * from xifenfei where lnnvl(year<2009);
     
    NAME                       YEAR
    -------------------- ----------
    xifenfei2008
    xifenfei2009               2009
    xifenfei2010               2010
    xifenfei2011               2011
     
    --year不为null(lnnvl表示年份为null)
    SQL> select * from xifenfei where lnnvl(year is not null);
     
    NAME                       YEAR
    -------------------- ----------
    xifenfei2008
     
    --年份为null(lnnvl表示年份不为null)
    SQL> select * from xifenfei where lnnvl(year is  null);
     
    NAME                       YEAR
    -------------------- ----------
    xifenfei2001               2001
    xifenfei2002               2002
    xifenfei2003               2003
    xifenfei2004               2004
    xifenfei2005               2005
    xifenfei2006               2006
    xifenfei2007               2007
    xifenfei2009               2009
    xifenfei2010               2010
    xifenfei2011               2011
     
    10 rows selected.
     
    --年份为12345(lnnvl表示年份不为12345)
    SQL> select * from xifenfei where lnnvl(year =12345);
     
    NAME                       YEAR
    -------------------- ----------
    xifenfei2001               2001
    xifenfei2002               2002
    xifenfei2003               2003
    xifenfei2004               2004
    xifenfei2005               2005
    xifenfei2006               2006
    xifenfei2007               2007
    xifenfei2008
    xifenfei2009               2009
    xifenfei2010               2010
    xifenfei2011               2011
     
    11 rows selected.
     
    --年份不为12345(lnnvl表示年份为12345或者null)
    SQL> select * from xifenfei where lnnvl(year !=12345);
     
    NAME                       YEAR
    -------------------- ----------
    xifenfei2008
  • 相关阅读:
    mybatis
    Spring原理
    JS 之继承
    HTTP协议简介2
    JS 之原型,实例,构造函数之间的关系
    HTTP协议简介1
    freemarker语法简介
    CSS 动画之十-图片+图片信息展示
    JS实现颜色值的转换
    抓包工具charles的使用
  • 原文地址:https://www.cnblogs.com/wushuishui/p/4414700.html
Copyright © 2011-2022 走看看