相关文章推荐
愤怒的菠萝  ·  Amazon ...·  2 年前    · 
威武的香菇  ·  小程序对接chatgpt - 掘金·  2 年前    · 

今天使用Spring Data中的pageable(int page,int pagesize,int sort,string sortcolumn)类进行分页查询后,发现在排序的字段sortcolumn有相同数据时,查询结果顺序会出现错乱。

将查询sql打印出来后发现,pageable封装的查询语句是这种格式的

SELECT * FROM (SELECT t.*, ROWNUM AS rowno FROM ( select * from table ORDER BY sortcolumn) t WHERE ROWNUM<#endRow# ) WHERE rowno>=#startRow#

看似这个sql没什么问题,实际执行过程:

select * from table ORDER BY sortcolumn

1.首先取出table表的所有数据,并按照sortcolumn排序,这一步没问题

SELECT t.*, ROWNUM AS rowno FROM (.....) t WHERE ROWNUM<#endRow#

2.取出table表中前#endRow#个数据,问题出在这里。当endRow变化时,查出的顺序也在变。

SELECT * FROM (......) WHERE rowno>=#startRow#

3.取出从第#startRow#个数据后的所有数据。
因为第二步查询的数据顺序变化了,最后截取的数据也不一样。

1.order by后面加上唯一性字段,比如id

SELECT * FROM (SELECT t.*, ROWNUM AS rowno FROM ( select * from table ORDER BY sortcolumn,id) t WHERE ROWNUM<#endRow# ) WHERE rowno>=#startRow#

用pageable类就是

import org.springframework.data.domain.PageRequest
val page = PageRequest(currentPage, pageSize, Sort.Direction.DESC, "sortcolumn,id")

2.手写sql,提取rownum到外部

SELECT * FROM (SELECT t.*, ROWNUM AS rowno FROM (select * from table ORDER BY LIST_ORDER) t ) WHERE rowno>=#startRow# and rowno<#endRow#
                    oracle进行分页查询时由order by排序引起的数据重复问题问题现象原因解决办法问题现象今天使用Spring Data中的pageable(int page,int pagesize,int sort,string sortcolumn)类进行分页查询后,发现在排序的字段sortcolumn有相同数据时,查询结果顺序会出现错乱。原因将查询sql打印出来后发现,pageable封装的查...
				
ORDER BY非稳定的排序 提一个问题oracleorder by 排序,是稳定排序算法吗? 发现用一个type进行排序后,做分页查询,第一页的数据和第二页的数据重复 怀疑是order by ,两次排列的顺序不一致 看到业务描述的问题可以得到的结论order by排序不稳定,还有第一个印象就是,type肯定是不唯一的,并且没有索引吧。 这里先科普下排序的稳定性,举个最简单的例子,1,2,3,1,4,5 排序 排序的结果是1,1,2,3,4,5,这候观察这个1,如果第一个1还是排序前的那个1,那么算法是稳定的。也就是说相等数在排序后不发生交换。 还记得以前数据结构中的几种排序算法
Oracle分页查询是没有进行任何排序操作的,Oracle是顺序的从数据块中读取符合条件的数据返回到客户端。 而Oracle排序算法不具有稳定性,也就是说,对于排序键值相等的数据,这种算法完成排序后,不能保证这些键值相等的数据保持排序前的顺序。 数据order by排序不唯一,的确会导致最终的数据排序是不是稳定的,表现出来的结果,就是分页重复显示; 建议在 ...
根据邀请人数倒序后的结果集,然后进行分页会出问题,第2页数据和第三页数据一样 解决方案: SELECT id as invite_id,`invite_num`,`wechat_user_space_id` FROM `ny_invite` WHERE `room_id` = 71391 AND `invite_num` <> 0 ORDER BY invite_num desc,id desc LIMIT 0,5 ; SELECT id as invite_id,`invite_num`...
用法:$aliaField=array("pic_url","product_id"); list ( $where, $sort, $order, $offset, $limit ) = $this->mybuildparams (null,null,$aliaField,"tableName"); $total = $this->model->where ( $where )->order ( $sort, $order )->count (); $list = $this->model->alias('a')->join('tableName b','a.product_id=b.product_id','left') ->field('a.id,b.pic_url,b.product_id')->where ( $where )->order ( $sort, $order )->limit ( $offset, $limit )->select (); select column_lists from (select rownum as rn,A.* from (select column_lists from table_name where col_1=:b0 order by col_2) A ) where rn<=:b2 and rn>:b1; 高效的写法 select column_lists from (se...
--1:无ORDER BY排序的写法。(效率最高) --(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT ROWNUM AS rowno, FROM emp WHERE hire_date BETWEEN TO_DATE ...
        公司有些项目需要通用mysqloracle,如果分别维护两套代码,就会很麻烦,但是在mysql环境下用limit来进行分页以及取最后一条数据这种类似的操作,到oracle数据库是不能用的。所以就要用到pageable         Pageable是org.springframework.data.domain包下的一个接口,我们在创建的候需要创建它的子类 Pageab...
使用PageHelper进行分页的候出现数据重复问题: 原因:PageHelper进行分页,如果排序字段不唯一或者可能为空,那么就可能出现查询结果在不同页中有重复数据,部分数据也因此查询不出来。这个bug似乎不一定百分百的出现,但是出现的概率非常的大。 解决办法:所以,如果要排序的字段的值不是唯一的,那么必须加上具备唯一性的主键id(或其他唯一性字段)作为辅助排序,这样就能避免查询结果重复。 SELECT tt.*, ROWNUM AS rowno FROM (SELECT * FROM XXXXX ORDER BY NAME) tt WHERE ROWNUM &lt;= ${page.endIndex}) table_alias WHERE table_alias.rowno &gt;= ${page.startIndex} 这个手写sql与mybatis-plus
rownum是Oracle数据库中的一个特有关键字,返回的是一个数字代表记录的行号。这篇文章主要介绍了oracle 使用rownum的二种分页方式,需要的朋友可以参考下 第一种,直接使用起止限定数: SELECT * FROM (SELECT t.*,ROWNUM r FROM TABLE t WHERE ROWNUM <= page*pageSize) WHERE r >= ((page - 1) * pageSize + 1) 第二种:使用BETWEEN: SELECT * ..