外部查询中的Oracle rownum给出了错误的结果

时间:2014-07-10 14:56:12

标签: oracle left-join rownum

我有一个很长的SQL查询,它使用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

任何人都可以告诉我为什么我的查询输出错误了吗?

1 个答案:

答案 0 :(得分:0)

在内部查询中,ROWNUM <= 10的测试将在应用ORDER BY this_.ID之前完成,因此您可以接受Oracle返回数据的顺序(可能是它们出现的顺序)无论使用什么索引来访问它们。

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

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

  1. 你不关心你回来的行
  2. 你刚开始 有序的结果集
  3. 您的要求的最佳方法可能是使用RANKDENSE_RANK分析函数。

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