2014-07-10 69 views
0

我有一个很长的sql查询,它使用rownum但给出了错误的值。下面是我的查询:Oracle Rownum在外部查询中给出了错误的结果

Select * 
FROM ( SELECT * 
    FROM R this_ 
     LEFT OUTER JOIN TS 
      ON this_.T1 = TS.T1 
     LEFT OUTER JOIN T 
      ON TS.T2 = T.T2 
     LEFT OUTER JOIN TS system4_ 
      ON T.SRC = system4_.system_id 
     LEFT OUTER JOIN TS system6_ 
      ON T.TGT = system6_.system_id 
     LEFT OUTER JOIN TS system7_ 
      ON touchpoint3_.INIT = system7_.system_id 
     LEFT OUTER JOIN ST 
      ON TS_.SC = ST.SC 
     LEFT OUTER JOIN RS 
      ON this_.status_id = RS.status_id 
     LEFT OUTER JOIN client client5_            ONsystem4_.CLIENT_ID=client5_.CLIENT_ID         
    WHERE this_.status_id = 5 
ORDER BY this_.ID --This is a column on R table 
)WHERE ROWNUM <= 10 

但是如果我把ROWNUM的子查询这样我得到正确的输出

WHERE this_.status_id = 5 and rownum<=10 

谁能告诉我为什么我得到的输出错误与我的查询?

+0

他们都是有效的查询 - 你的意思是正确/错误的输出?你根本没有显示任何输出。 –

回答

0

在内部查询的ROWNUM <= 10测试将ORDER BY this_.ID之前进行应用,让你在任何秩序的甲骨文在返回数据的怜悯(可能他们出现的顺序无论使用索引来访问它们

在外部查询中,您已经提供了一个有序集合,因此不能保证过滤前10行的结果是相同的,因为分配行号时元素的顺序不是相同

您应该使用ROWNUM来限制查询结果的唯一时间是:

  1. 你不关心这行,你回来
  2. 你开始与 一个有序的结果集

您的需求最好的办法可能是使用的RANKDENSE_RANK分析功能。

一个快速Google显示已经有how to do this的几个examples

+0

您需要将row_number()添加到rank/dense_rank组。 – vav