Oracle查询为同一组数据返回不同的结果

时间:2011-08-12 05:45:41

标签: oracle

我遇到了一个奇怪的问题,即同一个查询返回不同的结果。

我的查询是:

SELECT * FROM TX_HISTORY  WHERE acct = 7  AND ROWNUM 

发生的事情是,我知道对于此帐户,tx_history中有超过100条记录。我想根据处理日期获得前100条记录。 我这个帐户的数据是我有2004年至2011年的记录

问题是它有时会正确显示从2004年开始的100条记录 - 但有时它会显示我从2005年开始的100条记录

我读到这可以通过以下方式解决:

SELECT * FROM (select * from TX_HISTORY  WHERE acct = 7  ORDER BY acct,processing_date)
where rownum 

所以在我之前的查询中是: 1 GT;我的理解是,在rownum< = 100之后应用order by并且oracle返回的结果是按行随机过滤的随机顺序

虽然不明白为什么结果会有所不同 谢谢, 〜阿基拉

3 个答案:

答案 0 :(得分:8)

如果您没有指定任何排序(在这种情况下,正如您已经发现的那样,您没有订购要检索的数据,您只能在之后进行排序),由数据库按任何顺序返回它们认为合适。

例如,它可以按照存储顺序开始读取行,这些行随着数据的更新而变化。它也不必从表的顶部开始,它可以从缓冲区缓存中已有的块开始。

由于您没有指定订单,因此DB会选择(它认为是什么)在这个特定时刻可用的最便宜的方式。

答案 1 :(得分:0)

试试这个:

select top(100) from ...........

它给你想要的前100行。

答案 2 :(得分:0)

如果你包含AND RowNum <= 100,Oracle将免费提取100条记录。如果你把它放在

SELECT *
  FROM TX_HISTORY
 WHERE acct = 7
   AND ROWNUM <= 100
 ORDER BY acct,processing_date

对所有记录执行。

但是,如果你有

SELECT *
  FROM (select *
          from TX_HISTORY
         WHERE acct = 7
         ORDER BY acct,processing_date)
 where rownum <= 100

对子选择中返回的记录(SELECT中的( )执行。换句话说,Oracle使用一组不同的记录来执行AND RowNum <= 100。< / p>

对查询返回的记录执行排序,因此它发生在WHERE - 子句之后。所以你可能会得到不同的结果。

我希望我能说清楚。