Oracle分页查询

Oracle中分页查询语句

Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看。

Oracle分页查询语句基本上可以按照本文给出的格式来进行套用。
Oracle分分页查询格式:

复制代码

SELECT * FROM  
(  
SELECT A.*, ROWNUM RN  
FROM (SELECT * FROM TABLE_NAME) A  
WHERE ROWNUM <= 40  
)  
WHERE RN >= 21  

复制代码

 

其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

上面给出的这个Oracle分分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。查询语句如下:

复制代码

SELECT * FROM  
(  
SELECT A.*, ROWNUM RN  
FROM (SELECT * FROM TABLE_NAME) A  
)  
WHERE RN BETWEEN 21 AND 40  

复制代码

 

对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

 

分页计算方式:

<select id="getDcsLSpPriceRuleId" parameterClass="java.util.Map" resultClass="java.lang.Long">
        <dynamic>
            <isEqual property="isPaging" compareValue="true">
                SELECT *
                  FROM (SELECT ROW_.*, ROWNUM ROWNUM_
                         FROM (    
            </isEqual>
        </dynamic>  
        SELECT DISTINCT T.RULE_ID 
        FROM DCS_L_SP_PRICE T
        <isNotEmpty property="beginDate">
           where t.time_stamp >= to_date(#beginDate#,'yyyy-mm-dd hh24:mi:ss')
        </isNotEmpty>
        order by T.RULE_ID
        <dynamic>
            <isEqual property="isPaging" compareValue="true">
                  )ROW_
             <![CDATA[    WHERE ROWNUM <= #end#)  ]]>
             WHERE ROWNUM_ > #start#        
             </isEqual>
        </dynamic>   
     </select>
     
     


SELECT *
  FROM (SELECT ROW_.*, ROWNUM ROWNUM_
          FROM (
                
                SELECT *
                  FROM DCS_L_SP_PRICE T
                 where t.time_stamp >=
                       to_date(#beginDate#, 'yyyy-mm-dd hh24:mi:ss')
                 order by T.RULE_ID) ROW_
         WHERE ROWNUM <= #end#)
 WHERE ROWNUM_ > #start#


出错 sql


  select count(1)
        from cq_flights_segment_head a, CQ_FLIGHTS b
       where a.local_std  >=  trunc(sysdate - 1)
         and a.flights_id = b.flights_id  
         and origin_std  >=  to_date("2018-09-06 00:00:00")
         and  origin_std <=  to_date("2018-09-24 23:59:59");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值