在使用ORDER BY根据某个字段进行排序时,当有好几条数据这个字段值相同时,oracle会如何处理呢?
答案是,随机处理。
SELECT
* FROM (SELECT tt.*, ROWNUM AS rowno
FROM ( SELECT t.*
FROM AIMS_LIST_INFO t
WHERE 1=1
ORDER BY t.date_updated DESC ) tt
WHERE ROWNUM <= #{end}) table_alias
WHERE table_alias.rowno > #{begin}
这是使用sql实现分页的代码,当数据为批量导入时,date_updated这个字段的值都是一样的,这时我们会发现,第一页即begin=0&end=5和第二页即begin=5&end=10时会出现重复数据。
注:如果直接运行上述sql,赋值begin=0&end=100,执行若干次,会发现每次排序结果都一致,然而,这就能证明随机性是错误的嘛?
赋值begin=0&end=100
赋值begin=0&end=50
注意观察0-50条数据,是一致的嘛?
不是!!!
因此,前一种现象显然是数据库自身缓存的缘故,相同的sql执行结果会直接取缓存,而不是直接执行。
解决方式:在ORDER BY t.date_updated DESC中增加一个查询条件,打破这种排序字段完全一致导致的随机排序结果即可。 我增加的是表的主键,由oracle默认生成的
RAWTOHEX(SYS_GUID())
这是一个随机生成的具有唯一性的字段,这样应该可以避免排序字段完全一致造成的问题。