SQL分页排序的完成与分页数据重复问题ITeye - 娱乐之横扫全球

SQL分页排序的完成与分页数据重复问题ITeye

2019年03月28日13时38分01秒 | 作者: 辰良 | 标签: 排序,分页,问题 | 浏览: 1441

转自:http://www.linuxidc.com/Linux/2011-02/32593p2.htm

在oracle分页查询中,咱们选用相似以下所示的公认的比较高效的数据库分页查询句子(Effective Oracle by Design中有描绘、很多oracle使用者也做过测验)。

写道
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM = n)
WHERE RN m

根据Rownum进行分页,表面上看运转起来好像也没问题。但通过咱们实践查验,其实实际上有时是不安全的,在某些状况下会犯错,原因在于它没有排序。在分页状况下,第一页和第二页的数据是来自两次相对独立的SQL,假如没有排序,则SQL第一次和第2次履行时回来的成果是不共同的。
不共同是什么意思?假定有一个无排序的SQL,咱们把SQL履行两次:

第一次履行后会回来有1、2、3、4、5共5条记载
第2次履行后仍是会回来有1、2、3、4、5共5条记载
大部分状况下,这两次回来成果的次序是彻底相同的。但不幸的是,或许数据库有问题了,或许有人改了数据,横竖有时候它会不相同,比方第2次履行时第2条和第4条对调了,回来的是1、4、3、2、5共5条记载,如下:

第一次:1、2、3、4、5
第2次:1、4、3、2、5
假定咱们对这个SQL进行分页,每页3条记载,共两页,正常状况下成果是这样的:

拉第一页时,履行第一次SQL,按1、2、3、4、5排序,回来1、2、3三条记载
拉第二页时,履行第一次SQL,按1、2、3、4、5排序,回来4、5两条记载
但假如发作排序紊乱的问题,成果会这样:

拉第一页时,履行第一次SQL,按1、2、3、4、5排序,回来1、2、3三条记载
拉第二页时,履行第2次SQL,按1、4、3、2、5排序,回来2、5两条记载
成果咱们会发现,分页成果很不正常,2这条记载呈现了两次,4则消失了。正常来说,咱们不会注意到有数据丢掉,但咱们会注意到分页的数据有重复。

怎么办呢?那咱们就加一个排序吧,排序子句要加在最里层的SQL里,这样分页出来的成果才会是排序后的成果。比方按称号、类别或作者排序的order by子句:

select xxx.*
  from (
  select rownum as recordno
  from (
  select ID,NAME,ATYPE,CREATEDATE,CREATOR,ASTATUS from TAB001 where ATYPE=SOME_TYPE
  order by NAME,ATYPE,CREATOR
  ) xx
  ) xxx
where recordno = :开端记载号
  and recordno = :完毕记载号

这样是不是能够了呢?答案仍是不可,因为这些字段的值不是仅有的。可考虑一个极点状况,便是这个表里500万条记载的称号、类别和作者都彻底相同,会有什么成果呢?成果仍然是无序。

终究处理这个问题的方法,便是必定要用ID主键排序。不论前面有多少个order by字段,最后面必定要加上ID主键:


select xxx.*
  from (
  select rownum as recordno
  from (
  select ID,NAME,ATYPE,CREATEDATE,CREATOR,ASTATUS from TAB001 where ATYPE=SOME_TYPE
  order by NAME,ATYPE,CREATOR,ID
  ) xx
  ) xxx
where recordno = :开端记载号
  and recordno = :完毕记载号

因为主键ID是仅有的,所以只需ID不变,按ID排序就能确保每次履行分页SQL都是共同的次序了。
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章