首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

关于oracle中ROWNUM和ORDER BY的问题

2014-01-28 
关于oracle中ROWNUM和ORDER BY的问题:前两天同事发现网站上同一个商品在几页里都出现,然后查语句,发现有诡

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