精华内容
下载资源
问答
  • oracle数据分页通用写法select from where in( select from ( select rownum rn, from (select from ) ) where rn >= and rn ) ";总结的比较到位,写的很好,值得包装。2007-07-19 刘军

     oracle数据分页通用写法

    select <%=Fields%> from <%=TableName%> where <%=PrimaryKey%> in
    select <%=PrimaryKey%> from
      (
          select rownum rn,<%=PrimaryKey%> from
          (select <%=PrimaryKey%> from <%=TableName%> <%=Filter%> <%=OrderBy%>)
      )
      where rn >= <%=StartNumber%> and rn <=<%=EndNumber%>
    ) <%=OrderBy%>";

    总结的比较到位,写的很好,值得包装。2007-07-19 刘军

    展开全文
  • oracle 数据分页查询

    千次阅读 2005-06-18 18:23:00
    1. 最好还是利用分析函数 row_number() over ( partition by col1 order by col2 ) 比如想取出100-150条记录,按照tname排序 ...经过我的测试,在100万条数据的表中,检索数据的时候,方法2的速度要比方法1要快的.
    1. 最好还是利用分析函数
    row_number() over ( partition by col1 order by col2 )

    比如想取出100-150条记录,按照tname排序

    select tname,tabtype from (
       select tname,tabtype,row_number() over ( order by tname ) rn from tab
    )
    where rn between 100 and 150;

    2. 直接使用rownum 虚列
    select tname,tabtype from (
       select tname,tabtype,rownum rn from tab where rownum <= 150
    )
    where rn >= 100;
    使用序列不能基于整个记录集合进行排序,如果指定了order by子句,排序的的是选出来的记录集的排序.

    ------------------------------------------------------------------------
    经过我的测试,在100万条数据的表中,检索数据的时候,方法2的速度要比方法1要快的.
    展开全文
  • ORACLE分页查询SQL语句(最有效的分页)

    万次阅读 多人点赞 2018-11-01 16:18:24
    ** 一、效率高的写法 ** 1.无ORDER BY排序的写法。...即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT ROWNUM AS rowno, t.* FROM emp t WHERE hire_date BETWEEN TO_DATE ...

    一、效率高的写法

    1.无ORDER BY排序的写法。(效率最高)
    (经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!)

    SELECT *
    
      FROM (SELECT ROWNUM AS rowno, t.*
    
              FROM emp t
    
             WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                 AND TO_DATE ('20060731', 'yyyymmdd')
    
               AND ROWNUM <= 20) table_alias
    
     WHERE table_alias.rowno >= 10;
    

    2.有ORDER BY排序的写法。(效率较高)
    (经过测试,此方法随着查询范围的扩大,速度也会越来越慢哦!)

    SELECT *
    
      FROM (SELECT tt.*, ROWNUM AS rowno
    
              FROM (  SELECT t.*
    
                        FROM emp t
    
                       WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                           AND TO_DATE ('20060731', 'yyyymmdd')
    
                    ORDER BY create_time DESC, emp_no) tt
    
             WHERE ROWNUM <= 20) table_alias
    
     WHERE table_alias.rowno >= 10;
    

    二、效率垃圾但又似乎很常用的分页写法

    3.无ORDER BY排序的写法。(建议使用方法1代替)
    (此方法随着查询数据量的扩张,速度会越来越慢哦!)

    SELECT *
    
      FROM (SELECT ROWNUM AS rowno, t.*
    
              FROM k_task t
    
             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                   AND TO_DATE ('20060731', 'yyyymmdd')) table_alias
    
     WHERE table_alias.rowno <= 20 AND table_alias.rowno >= 10;
    
    --TABLE_ALIAS.ROWNO  between 10 and 100;
    

    4.有ORDER BY排序的写法.(建议使用方法2代替)
    (此方法随着查询范围的扩大,速度会越来越慢哦!)

    SELECT *
    
      FROM (SELECT tt.*, ROWNUM AS rowno
    
              FROM (  SELECT *
    
                        FROM k_task t
    
                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                             AND TO_DATE ('20060531', 'yyyymmdd')
    
                    ORDER BY fact_up_time, flight_no) tt) table_alias
    
     WHERE table_alias.rowno BETWEEN 10 AND 20;
    

    5.另类语法。(有ORDER BY写法)
    (语法风格与传统的SQL语法不同,不方便阅读与理解,为规范与统一标准,不推荐使用。)

    WITH partdata AS
    
         (
    
            SELECT ROWNUM AS rowno, tt.*
    
              FROM (  SELECT *
    
                        FROM k_task t
    
                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                             AND TO_DATE ('20060531', 'yyyymmdd')
    
                    ORDER BY fact_up_time, flight_no) tt
    
             WHERE ROWNUM <= 20)
    
    SELECT *
    
      FROM partdata
    
     WHERE rowno >= 10;
    
     
    
    --6另类语法 。(无ORDER BY写法)
    
    WITH partdata AS
    
         (
    
            SELECT ROWNUM AS rowno, t.*
    
              FROM k_task t
    
             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                   AND TO_DATE ('20060531', 'yyyymmdd')
    
               AND ROWNUM <= 20)
    
    SELECT *
    
      FROM partdata
    
     WHERE rowno >= 10;
    

    三、分析

    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控制分页查询的每页的范围。

    上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在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最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

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

    这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。

    下面简单讨论一下多表联合的情况。

    对于最常见的等值表连接查询,CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。

    因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:

    SELECT *
    
      FROM (SELECT a.*, ROWNUM rn
    
              FROM (SELECT *
    
                      FROM table_name) a
    
             WHERE ROWNUM <= 40)
    
     WHERE rn >= 21
    
    展开全文
  •  做项目过程时,遇到hibernate实现分页功能中,在不同页面有存在重复数据。一开始以为是hibernate的问题,打开hibernate的show_sql=true开启,将生成的sql在plsql中执行复现了数据重复的问题。查阅资料得知,oracle...

    问题   

            做项目过程时,遇到hibernate实现分页功能中,在不同页面有存在重复数据。一开始以为是hibernate的问题,打开hibernate的show_sql=true开启,将生成的sql在plsql中执行复现了数据重复的问题。查阅资料得知,oracle在保证order by字段的排序外,相同order by字段的值不同记录之间排序顺序并不稳定。

           比如表a 

    id score
    1 5
    2 10
    3 10
    4 20

    oracle常见的分页sql查询的前两条的记录

    select id,score,rownum rn from (select * from a order by score) where rownum<=2

    
    
    
    结果1为
    

    id score
    1 5
    2 10
    oracle第二页的sql为

    select id,score from (select id,score,rownum rn from (select * from a order by score) where rownum<=4) where rn>2
    结果2为

    id score
    2 10
    4 20

    出现这种情况因为oracle排序算法的不稳定。

    解决方案

           再不影响现有排序效果下,增加唯一排序字段,比如主键或者rowid等字段。

    展开全文
  • Oracle排序分页出现重复数据 原因:Oracle的排序机制问题,Oracle进行排序时需要保证排序的字段是唯一的,如果不是唯一则会导致分页查询时,不同页之间出现重复的数据; 只需在业务排序字段后面加上主键id或者其他...
  • 源代码实现的实在Java web与Oracle数据开发过程中的分页功能,代码不难,看看就能看懂,使用其中的核心代码能够轻易实现分页功能。希望对初学者有一定的帮助。
  • oracle-分页

    千次阅读 2018-08-18 20:15:29
    Oracle分页查询语句 Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看。 Oracle分页查询语句基本上可以按照本文给出的格式来进行套用...
  • Oracle数据库分页查询

    千次阅读 2019-01-18 11:32:36
    oracle数据库分页查询
  • 使用Oracle数据库的小伙伴可能或多或少会接触到对某表做数据分页查询的情况。在数据分页查询时,可能出现分页数据重复,甚至连翻好几页数据都有重复,或者干脆无任何变化。检查SQL执行情况发现几乎找不到任何错误,...
  • Oracle分页查询

    2021-04-10 17:35:22
    Oracle分页查询1 分页查询引入2 Oracle分页查询 1 分页查询引入 关于查询功能, 一次将所有查询结果返回给前台,带来的问题有: 1是查询量较大,查询时间多 2是前台的数据展示能力有限. 所以一般采用分页查询功能. ...
  • 在使用oracle数据库(11g,11.2.0.4.0)做排序分页的时候,发现分页返回的数据跟一次性分页返回的数据不一样 ORM框架: mybatis-plus 使用自带分页对象 com.baomidou.mybatisplus.extension.plugins.pagination.Page 例如...
  • oracle 数据库分页中的order by 后数据重复问题 在开发系统软件时,经常会使用oracle数据库分页,但是最近发现组装的分页sql没有问题,但是每次点下一页显示数据都一样,解决办法如下: 1、sql语句中必须有排序条件...
  • 使用 Oracle 的多分页查询语句,不同页面之间出现数据重复,但是数据库的数据是正确的,查询全部的时候也能显示出来。其数据如图1,图2 所示。但是当点击最后的页码时,数据会发生变化  使用的 sql:SELECT * ...
  • oracle数据库分页

    2019-03-26 14:09:10
    oracle不像mysql有limit分页函数,只能借助于rownum来进行分页。使用rownum分页一共有三种写法。 第一种: select * from table where rownum<11 minus select * from table where rownum<1 第二种: ...
  • ORACLE-分页

    2015-10-07 17:00:59
    Oracle分页查询语句基本上可以按照本文给出的格式来进行套用,分页查询格式 SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM 40 ) WHERE RN >= 21 其中最内...
  • 优化过一次SQL,结果生产环境上出了问题,分页查询有重复数据。原SQL使用order by 进行分页查询,出现数据重复的问题,排查后发现是数据库没有唯一字段导致。 暂时能想到的解决办法是: 1.order by 后面条件需要...
  • 通常一般的分页语句如下: select *from (select row_.*, rownum rownum_from ( select p.id from table1 porder by p.DATA_UPDATE_TIME desc )row_ where rownum <= ?) bwhere b.rownum_ >? 当红字...
  • oracle 高效分页

    千次阅读 2010-08-03 10:26:00
    oracle 高效分页
  • 一、oracle中的相关查询?...二、oracle去除重复数据 1. 2. 3.oracle 实现分页? 利用rownum的唯一性,和子查询,将rownum从伪列变成实际列! 转载于:https://www.cnblogs.com/ZXF6/p/10822309.html...
  • Oracle分页实现

    万次阅读 2017-12-07 18:02:47
    Oracle中实现分页的方法大致分为两种,用ROWNUM关键字和用ROWID关键字
  • Oracle数据分页处理

    2019-08-21 17:24:37
    有排序的分页 SQL 写法 第一种:(三层查询的方式,跟上面相同)   SELECT * FROM   (  SELECT A. * , ROWNUM RN  FROM ( SELECT * FROM TABLE_NAME) A  WHERE ROWNUM 10...
  • 通过浏览器访问数据量大的表时需要进行分页。ASP对数据库记录分页显示可以通过ADO对象集Recordset对象...本文将介绍一种利用 ASP实现对Oracle数据记录分页显示的方法,使得Oracle用户能够轻松方便地实现记录分页显示。
  • oracle rownum分页出现重复数据 2013-07-15 0 个评论 作者:神勇小白鼠收藏   我要投稿 oracle rownum分页出现重复数据   通常一般的分页语句如下:   ? 1 2 3
  • Oracle自动分页

    2020-11-25 16:48:53
    Oracle的自动分页SQL语句 分页规律总结:每页显示m条数据,查询第n页数据 select * from (select rownum r,e. * from 要分页的表 e where rownum<=mn) t where r>mn-m ; 要分页的表既可以是真实的表,也可以是...
  • Oracle分页

    万次阅读 多人点赞 2019-06-11 08:32:36
    下面是Oracle分页简单事例图片以及代码: 1、普通查询: select * from table_Namet order by active_count desc; 2、查询第一条记录: select * from (select * fromtable_Nameorder byactive_countdesc) ...
  • Oracle sql分页原理

    2018-03-09 11:36:17
    本文针对OracleSql分页原理进行研究学习,如有不对欢迎指正Oracle的表中,除了开发者自己拟定的字段外还有一些,Oracle自动生成的虚拟字段(伪列),常用的有:sysdate, systimestamp,RowNum ,RowID, CURRVAL, ...
  • 现在公司做的管理系统中有很多数据,往往需要...就开始排查,先从代码上进行,没有问题,构造的sql语句也没有问题,将sql语句直接在oracle上运行返回结果一比较,发现oracle返回的分页数据本身都是有重复数据的,这下算
  • Oracle分页,大部分情况下,我们是记不住了。说思路,要使用三层嵌套查询。 Oracle分页有点儿记不住了,只记得一些大概。是使用了三层嵌套查询。如果在工作中使用了,可以到原来的项目中拷贝或上网查...
  • Oracle数据库分页

    千次阅读 2019-01-24 09:33:48
    pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 totalRecouds 表中的总记录数 select count (*) from 表名 totalPages 总页数 totalPages = totalRecouds%pageSize == 0 ? totalRecouds/pageSize : ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,734
精华内容 21,493
关键字:

oracle数据分页