我遇到了一个奇怪的问题,即同一个查询返回不同的结果。
我的查询是:
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返回的结果是按行随机过滤的随机顺序
虽然不明白为什么结果会有所不同 谢谢, 〜阿基拉
答案 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
- 子句之后。所以你可能会得到不同的结果。
我希望我能说清楚。