【问题标题】:Oracle/SQL - Select specified range of sequential recordsOracle/SQL - 选择指定范围的连续记录
【发布时间】:2011-02-01 04:05:59
【问题描述】:

我正在尝试从连接中选择一个记录子集,从 5000 到 10000。过去我曾收到过这样的查询,但它们的复杂性略低。这是我正在尝试使用的查询,如果我删除 rownum/rnum 引用(以及外部选择),我会按预期收到所有记录,所以我知道逻辑是好的。

SELECT      * 
    FROM    ( 
            SELECT  unique cl.riid_, 
                    rownum as rnum 
            FROM    <table 1> cl, <table 3> mil 
            WHERE   cl.opt = 0 AND 
                    (cl.st_ != 'QT' OR cl.st_ IS NULL) AND 
                    cl.hh = 0 AND 
                    cl._ID_ = mil._ID_ AND 
                    mil.TYPE in (0, 1, 2, 3, 4) AND 
                    EXISTS 
                        ( SELECT    'x' 
                            FROM    <table 2> sub 
                            WHERE   cl.ea_ = lower(sub.ea_) AND 
                                    sub.status = 0 AND 
                                    lower(sub.subscription) = 'partner' 
                        ) AND 
                    rownum <= 10000 
            ) 
    where   rnum > 5000

因此,当我运行此查询时,我会从我们的系统收到此消息(这不是 Oracle cli 接口,而是存在于其顶部的 Web 层,因此如果它不正常,请显示错误消息)

'错误:选择查看的资源无效。在查看其数据之前,您可能需要重新创建或修复该对象。'

资源将是查询的结果。

那么有没有人知道发生了什么或更好的方法来做到这一点?

谢谢!

【问题讨论】:

  • 它没有理由不工作,但没有 ORDER BY 结果集的顺序是不确定的,所以为什么不挑选前 5000 行。查询中没有任何内容可以将任何特定行放入“第二个”5000 而不是“第一个”5000。
  • 您是否尝试过在 SQL Plus 中运行 SQL 而不是在您的 OO 工具中运行以查看是否正常?
  • @Gary 我忘记了 ORDER BY 哎呀!至于第二部分,我实际需要做的是编写 4 个查询。一个返回第一个 5000,然后返回下一个 5000,依此类推。因此我需要返回第二个 5K。第一个查询效果很好,只是这些第二、第三、第四组查询不起作用。
  • @Tony 很遗憾我没有能力这样做。
  • 错误消息看起来不像 Oracle 消息。您使用什么工具来运行查询?

标签: sql oracle range subset


【解决方案1】:

我相信您正在 Oracle 中寻找类似的东西:

select * 
  from ( select a.*, rownum rnum
           from ( YOUR_QUERY_GOES_HERE -- including the order by ) a
          where rownum <= MAX_ROWS )
 where rnum >= MIN_ROWS
/

来自 Ask Tom 的精彩讨论是 here

【讨论】:

  • 感谢您的回复,但除非我遗漏了什么,否则这不是我在示例中已经在做的吗?
  • 乍一看并不完全,你应该有类似的东西: select * from (select a.riid, rownum rnum from (select cl.riid, ... where ... order by ... ) a where rownum = MIN_ROWS;
  • dscl - 我相信 tbone 试图指出的细微差别是 rownum 是在按 ORDER BY 对行排序之前分配的。因此,您需要多一层嵌套。您将以所需的正确顺序获得原始查询(第一级;示例输出:第 1-100,000 行)。然后从中选择并将 rownum 分配给别名列,并将查询限制为您需要的上限(级别 2;示例输出:行 1-10,000)。然后从中选择并设置下限(3 级;示例输出:第 5,000-10,000 行)。
猜你喜欢
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
相关资源
最近更新 更多