Oracle Order By后导分页数据重复

来源:互联网 发布:中国纺织品出口数据图 编辑:程序博客网 时间:2024/06/06 08:31

oracle使用rownum排序分页排序字段不唯一导致分页数据混乱


搬砖:

-------------------------------------------------------


oracle分页采用三层嵌套+rownum分页时,如果有order by。

前置条件:分页脚本中存在order by

问题暴露:分页时好时坏

问题本质:order by 在相同的数据下,排序具有不确定性

解决方法:最简单的办法,习惯性在order by后面加rownum或rowid,推荐加rowid

补充:如果有分析函数的情况按照具体情况处理,不可千篇一律


今天公司系统中的一个分页的界面出现了重复数据的问题,检查之后确认前端分页控件及后台的SQL语句都没有问题且该表也没有存在重复的数据记录。在继续分析之后发现是由于排序的字段出现大批的重复值造成的。

例如以下语句中,ORDER_COLUMN列并不能确定其唯一性,那么ORACLE在每次执行排序时并不能确定数据的唯一性,导致同样的排序顺序但是每次运行时并不能保证得到一样的结果。


[sql] view plain copy
  1. SELECT  
  2.     *   
  3. FROM  
  4.     ( SELECT  
  5.         ROW_.*,  
  6.         ROWNUM ROWNUM_   
  7.     FROM  
  8.         ( SELECT  
  9.             *  
  10.          FROM  T  
  11.          ORDER BY  
  12.             ORDER_COLUMN ) ROW_   
  13.         WHERE  
  14.             ROWNUM <= 10  
  15.          )   
  16. WHERE  
  17.     ROWNUM_ > 20 

有以上的结论之后处理方法也就简单明了了,Order By中的字段必须能够确保唯一即可:

[sql] view plain copy
  1. SELECT  
  2.     *   
  3. FROM  
  4.     ( SELECT  
  5.         ROW_.*,  
  6.         ROWNUM ROWNUM_   
  7.     FROM  
  8.         ( SELECT  
  9.             *  
  10.          FROM  T  
  11.          ORDER BY  
  12.             ORDER_COLUMN ,ROWID) ROW_   
  13.         WHERE  
  14.             ROWNUM <= 10  
  15.          )   
  16. WHERE  
  17.     ROWNUM_ > 20 


参考自:http://blog.csdn.net/yygg329405/article/details/53811095

阅读全文
0 0
原创粉丝点击