当前位置: 代码迷 >> Oracle认证考试 >> 帮小弟我优化一上这条oracle 的sql语句?多谢大家
  详细解决方案

帮小弟我优化一上这条oracle 的sql语句?多谢大家

热度:2121   发布时间:2013-02-26 00:00:00.0
帮我优化一下这条oracle 的sql语句?谢谢大家!
SELECT * 
  FROM tpi_pay_amount p1 
WHERE p1.paydate = 
          (SELECT MAX (p.paydate) 
            FROM tpi_pay_amount p 
            WHERE p.worklist_id = '402880791ad407a2011ad40a9fea0001' 
              AND p.paydate < (SELECT MAX (p3.paydate) 
                                FROM tpi_pay_amount p3)) 
  AND p1.worklist_id = '402880791ad407a2011ad40a9fea0001' 

我想在表tpi_Pay_Amount中得到worklist_Id='402880791ad407a2011ad40a9fea0001'的记录集,并且在此基础上找到paydate第二大的那条记录.其中worklist_Id不是表tpi_Pay_Amount 的主键.谁能帮我写一条效率高的sql语句.谢谢. 
十份感谢!! 
有人说用rownum做,但是不行呀: 
SELECT * FROM ( 
SELECT rownum rn, t.* FROM tpi_pay_amount 
WHERE worklist_id = '402880791ad407a2011ad40a9fea0001' 
ORDER BY paydate DESC) t 
WHERE rn = 2 

原因: 

关于oracle子查询以及rownum的有关经验: 
rownum含义解释:  
  1、rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,    
     依此类推,这个伪字段可以用于限制查询返回的总行数。    
  2、rownum不能以任何基表的名称作为前缀。      
    

  使用方法: 
SQL>  select  rownum,month,sell  from  sale  where  rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)    
    
        rownum  MONTH              SELL    
  ---------  ------  ---------    
                  1  200001            1000    
    
  SQL>  select  rownum,month,sell  from  sale  where  rownum=2;(1以上都查不到记录)    
    
  没有查到记录    
    
  SQL>  select  rownum,month,sell  from  sale  where  rownum>5; 
(由于rownum是一个总是从1开始的伪列,Oracle  认为这种条件不成立,查不到记录) 
oracle的rownum是不能等于2的!!!!!!  
------解决方案--------------------------------------------------------


需要给paydate建立一个index:

SELECT *
  FROM tpi_pay_amount
 WHERE paydate =
       (SELECT paydate
          FROM (SELECT paydate, DENSE_RANK() OVER(ORDER BY HIREDATE) RN
                  FROM tpi_pay_amount
                 WHERE worklist_id = '402880791ad407a2011ad40a9fea0001')
  相关解决方案