SELECT * FROM (SELECT t.*, ROWNUM AS rowno FROM (select * from table ORDER BY LIST_ORDER) t ) WHERE rowno>=
oracle进行分页查询时由order by排序引起的数据重复问题问题现象原因解决办法问题现象今天使用Spring Data中的pageable(int page,int pagesize,int sort,string sortcolumn)类进行分页查询后,发现在排序的字段sortcolumn有相同数据时,查询结果顺序会出现错乱。原因将查询sql打印出来后发现,pageable封装的查...
ORDER BY非稳定的排序
提一个问题: oracle在order 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 ...
公司有些项目需要通用mysql与oracle,如果分别维护两套代码,就会很麻烦,但是在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 <= ${page.endIndex}) table_alias
WHERE table_alias.rowno >= ${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 * ..