读书人

关于oracle中ROWNUM和ORDER BY的问题

发布时间: 2014-01-28 21:26:02 作者: rapoo

关于oracle中ROWNUM和ORDER BY的问题

前两天同事发现网站上同一个商品在几页里都出现,然后查语句,发现有诡异的事情,原来以为可能是物化视图的关系,不过今天我测试了下,是和ORDER BY 里出现并列数据有关
先举例说明下

SQL code
SELECT a.*,rownum  FROM (SELECT   good_id, good_nm, prc            FROM tb_ag001        ORDER BY prc) a


出来的结果


加了过滤

SQL code
SELECT *  FROM (SELECT   good_id, good_nm, prc            FROM tb_ag001        ORDER BY prc) WHERE ROWNUM <9




另外种写法

SQL code
SELECT *  FROM (SELECT   good_id, good_nm, prc            FROM tb_ag001        ORDER BY prc) WHERE ROWNUM <= 8




可以看到6-8项目不一样了,按道理rownum <=8和rownum <9结果是一样,但出现了不同,不过如果再包层,结果就一致了,并且是正确的

SQL code
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次排序结果不一定相同
这是我的猜测
------解决方法--------------------------------------------------------        

读书人网 >oracle

热点推荐