【问题标题】:using of rownum function with ">" sign in oracle [duplicate]在oracle中使用带有“>”的rownum函数[重复]
【发布时间】:2017-09-06 11:09:29
【问题描述】:

我想通过 rownum 函数 i_e "(rownum>3)" 选择大于 3 的行数 例如,如果有 25 行,我想通过 rownum 函数检索最后 22 行。 但是当我写

select * from test_table where rownum>3;

它不检索任何行。 谁能帮我解决这个问题。 提前致谢

【问题讨论】:

  • 试试select * from test_table where rownum<=3
  • 你试过搜索吗?类似的问题还有很多,例如this one。此外,您需要定义如何确定一行是否比另一行“更大”
  • Quote from the manual "对大于正整数的 ROWNUM 值进行条件测试始终为假"
  • 这不是 ROWNUM 的工作方式。您可以使用 ROW_NUMBER 分析函数来执行此操作,但您仍然需要根据列来确定什么“重要”以对其进行排序。

标签: sql oracle pagination oracle10g


【解决方案1】:

它不起作用,因为:对于第一行假设 ROWNUM 为 1,并且由于您的 WHERE 子句是 ROWNUM>3,那么这将减少到 1>3 并且该行被丢弃。随后的行将针对 1 的ROWNUM 进行测试(因为前一行不再在输出中,现在不需要行号),这将再次失败并被丢弃。重复,令人作呕,所有行都未能通过WHERE 子句过滤器并被丢弃。

如果您想为行分配ROWNUM,那么您需要这样做是一个子查询:

SELECT *                  -- Finally, in the outer query, filter on the assigned ROWNUM
FROM   (
  SELECT t.*,             -- First, in the inner sub-query, apply a ROWNUM
         ROWNUM AS rn
  FROM   test_table t
)
WHERE  rn > 3;

或者,如果您想在编号之前对结果进行排序:

SELECT *                  -- Finally, in the outer query, filter on the assigned ROWNUM
FROM   (
  SELECT t.*,             -- Second, in the next level sub-query, apply a ROWNUM
         ROWNUM AS rn
  FROM   (
    SELECT *              -- First, in the inner-most sub-query, apply an order
    FROM   test_table
    ORDER BY some_column
  ) t
)
WHERE  rn > 3;

【讨论】:

    【解决方案2】:
    select * from (select rownum as rn, t.* from test_table t) where rn > 3
    

    有关更多示例,请参阅本文 On Top-n and Pagination Queries By Tom Kyte

    【讨论】:

    • 感谢您的回答......
    【解决方案3】:

    在 RDBMS 中没有第一行或最后一行。你所说的“raws”,实际上是 set(sets),它们可以订购或不订购。 rownum 是一个函数,它只是枚举结果集,只有在计算集合之后才有意义,要对您的数据集(行)进行排序,您应该在 rownum 调用之前在查询中执行此操作,您必须告诉数据库什么在特定的 select 语句中表示订单。

    【讨论】:

    • 实现结果的一种方法是 - select * from test_table minus select * from test_table where rownum<=3;
    • @Tom J Muthirenthi 这个结果是什么意思?给“一些行”,哦,没有“一些行”太多了,给我少3个。 RDBMS 中的“关系”这个词一定意味着什么,不是吗?
    • ROWNUM 不是一个函数 - 它是一个 pseudo-column。此外,您不需要指定顺序 - 如果您不指定,那么 Oracle 将按照检索到的行的顺序对行进行编号(这可能导致不确定的顺序)。
    • "@MT0 不能同意,是的,根据 Oracle 文档,rownum 是伪列,但将它们视为函数并没有错误。“伪列”的行为就像一个表格列,这就是他们称之为“伪列”,但实际上它们是作为系统函数实现的。
    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多