我的异常网 Java Web开发 Java 面试 J2ME J2EE Java相关 Eclipse J2SE .NET分析设计 .NET Framework .NET面试 .NET组件控件 VC J# Delphi .NET报表 C# ASP LINQ .NET新技术 VB Web Service .NET相关 Oracle面试 Oracle认证考试 Oracle管理 Oracle开发 Oracle技术 Java Exception DotNet Exception Oracle Exception
  

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

    
如异常没有得到解决,请继续查看以下解决方法:
    暂无相关解决方法。
热点异常解决方法
最新异常解决方法
随机异常解决方法