关于oracle中ROWNUM和ORDER BY的问题:
前两天同事发现网站上同一个商品在几页里都出现,然后查语句,发现有诡异的事情,原来以为可能是物化视图的关系,不过今天我测试了下,是和ORDER BY 里出现并列数据有关
先举例说明下
SELECT a.*,rownum FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc) a
出来的结果
加了过滤
SELECT * FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc) WHERE ROWNUM <9
另外种写法
SELECT * FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc) WHERE ROWNUM <= 8
可以看到6-8项目不一样了,按道理rownum <=8和rownum <9结果是一样,但出现了不同,不过如果再包层,结果就一致了,并且是正确的
SELECT * FROM (SELECT a.*, ROWNUM rn FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc) a) WHERE rn < 9
SELECT *
FROM (SELECT a.*, ROWNUM rn
FROM (SELECT good_id, good_nm, prc
FROM tb_ag001
ORDER BY prc) a)
WHERE rn <=8
------解决方法--------------------------------------------------------
可能和子查询在内存中的排序有关吧
值相同时,排序不稳定。执行相同查询的时候,会从共享池中调用之前的结果
因为调用了相同的数据集
SELECT a.*, ROWNUM rn
FROM (SELECT good_id, good_nm, prc
FROM tb_ag001
ORDER BY prc) a
因此rn <=8和rn <9是一样的
至于前面的写法,
SELECT good_id, good_nm, prc
FROM tb_ag001
ORDER BY prc
order by会在内存中重新排序?因此2次排序结果不一定相同
这是我的猜测
------解决方法--------------------------------------------------------