【问题标题】:Oracle query returning differnet results for same set of dataOracle查询为同一组数据返回不同的结果
【发布时间】:2011-10-25 13:10:17
【问题描述】:

我面临一个奇怪的问题,即同一个查询返回不同的结果。

我的查询是:

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)
其中rownum 

所以在我之前的查询中是: 1> 我的理解是 order by 是在 rownum

虽然不明白为什么结果会有所不同 谢谢, ~akila

【问题讨论】:

    标签: oracle


    【解决方案1】:

    如果包含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 &lt;= 100

    排序是在查询返回的记录上执行的,所以它发生在WHERE-clause 之后。所以你可能仍然会得到不同的结果。

    我希望我能说得更清楚。

    【讨论】:

    • 排序不能按预期工作的部分已经得到解答。这个问题就是为什么重复运行查询时结果甚至不一致。
    • @Thilo:所以你在抱怨我的回答中的一行?
    • 我只是抱怨您根本没有回答这个问题,即“为什么对相同数据的相同查询有时会返回不同的结果”。您的答案中甚至接近的一行是“排序是对查询返回的记录执行的,因此您可能仍会得到不同的结果”。为什么该查询有时会返回不同的记录?
    【解决方案2】:

    如果您没有指定任何顺序(在这种情况下,正如您已经发现的那样,您不会对正在检索的数据进行排序,您只需在之后进行排序),由数据库以任何顺序返回它们觉得合适。

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

    由于您没有指定顺序,数据库将选择(它认为是)在这个特定时刻可用的最便宜的方式。

    【讨论】:

    • Thilo - 谢谢你和我的歉意 - 我从来没有将它标记为正确答案
    【解决方案3】:

    试试这个:

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

    它给出了你想要的前 100 行。

    【讨论】:

    • 排序不能按预期工作的部分已经得到解答。这个问题就是为什么重复运行查询时结果甚至不一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2021-11-27
    • 2014-09-24
    相关资源
    最近更新 更多