数据库排序后,分页,导致查询数据丢失
sql如下:
select * from ( select tmp_page.*, rownum row_id from ( select d.CHECK_TIME d.CAR_NO carNo, from aaa d order by d.CHECK_TIME desc
) tmp_page where rownum <= 20
) where row_id > 0
问题排查步骤:
1.查看sql:
select d.CHECK_TIME d.CAR_NO carNo, rownum from aaa d order by d.CHECK_TIME desc
select tmp_page.*, rownum row_id from ( select d.CHECK_TIME d.CAR_NO carNo, rownum from aaa d order by d.CHECK_TIME desc ) tmp_page where rownum <= 20
发现两次的rownum结果不同,经分析,CHECK_TIME的数据内容格式:YYYYMMDDHH,不能保证排序的唯一性,导致了可能数据会丢失现象。
解决方案: order by d.CHECK_TIME desc,d.pk desc, pk能保证排序的唯一性。
如果没有主键pk,可以用 order by d.CHECK_TIME desc,d.ROWID desc 保证排序的唯一性。
总结:只要order by之后的字段能保证排序唯一性,就不会出现问题。比如order by pk,就不会有问题;或者组合的order by,只要能保证唯一就OK。