2014-07-10 68 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