首页 > 编程知识 正文

分页查询出现重复数据,sql筛选字段重复数据

时间:2023-05-04 01:18:06 阅读:33808 作者:2723

33559 www.cn blogs.com/magic 101/p/10064947.html

完全复制!只为记录

今天考试的时候遇到了漏洞。 分页查询中出现的数据顺序不正确。 (第1页上调查的数据也跑到第2页) ) )。

我们发现,如果检索并单独运行mybatis日志中的sql,结果是正确的。 为什么mybatis调查的数据是胡说八道呢?

第一个分析可能是由于排序列中的重复值,但我的sql中没有排序字段。

尝试有两种解决方案:

1、在sql后加order by主键,分页查询正确。

2、这不是解决办法。 数据库表的主键已删除。 在主键上加上分页符是正确的

在网上查了一下资料,有这样的话。

oracle按块读取数据。 数据按顺序存储时,读取的数据将按顺序排列,用户可能会将其误认为默认排序。 实际上,oracle没有执行排序操作。 如果sql未请求排序,oracle将从数据块中按顺序读取符合条件的数据,并将其返回给客户机。 因此,如果未使用排序sql,则分页返回的数据是顺序还是杂乱取决于数据的存储位置。 在oracle分页查询期间,如果数据的物理位置发生更改,则分页数据可能会重复。

处理这种情况的机制因oracle版本而异。 9根据rowid进行排序,但10.2种类型引入了类似堆栈排序的方法。 在order by之后建立索引会解决问题,因为即使存在重复值,也可以通过索引进行区分。

但是,为什么在有排序条件时,仍然会出现数据重复的现象呢?

了解oracle的排序机制后,您会发现出现这种情况的原因是排序列值不唯一。 Oracle使用的排序算法不稳定。

也就是说,对于键值相等的数据,该算法不会确保在完成排序后,这些键值相等的数据保持排序前的顺序。

解决方案是在后面添加唯一的列,如主键。

因此,解决方法如下。 (两个条件必须同时满足) :

1.sql语句需要排序条件。

2 .如果排序条件没有唯一性,那么后面必须跟着唯一性的条件,例如主键。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。