在oracle中使用rownum函数与“>”符号的用法

16 浏览
0 Comments

在oracle中使用rownum函数与“>”符号的用法

我想通过rownum函数选择行数大于3的行,例如如果有25行,我想通过rownum函数检索最后22行。但是当我写下面的代码时,却没有检索到任何行:\nselect * from test_table where rownum>3;\n有人能帮我解决这个问题吗?先谢谢了。

0
0 Comments

在Oracle数据库中,当使用rownum函数与 ">" 运算符一起使用时,可能会出现问题。rownum是一个伪列,它用于给查询结果中的每一行分配一个唯一的行号。在上述的查询中,我们使用了rownum函数来给查询结果中的每一行分配一个行号,并筛选出行号大于3的结果。

然而,使用rownum函数的时候需要注意,它是在数据被检索出来后再进行行号分配的。这意味着,当我们使用rownum > 3来筛选结果时,实际上我们只能得到行号大于3的结果,而无法得到前3行的结果。

解决这个问题的方法是使用子查询。我们可以将原始查询作为子查询,并在外部查询中使用rownum > 3来筛选结果。这样,我们就可以得到行号大于3的结果,并且保留了前3行的结果。

下面是修改后的查询:

select * from (select rownum as rn, t.* from test_table t) where rn > 3

通过这种方式,我们可以解决在Oracle数据库中使用rownum函数与 ">" 运算符一起使用时可能出现的问题。请参考Tom Kyte的文章了解更多示例和解决方法。

0
0 Comments

使用ROWNUM函数与">"符号在Oracle中的用法

在Oracle中,ROWNUM函数与">"符号一起使用时可能会出现问题。原因是对于第一行,ROWNUM被假设为1,而由于WHERE子句是ROWNUM>3,所以这变成了1>3,因此该行被丢弃。接下来的行将被测试其ROWNUM是否为1(因为前一行已不在输出中,不再需要行号),这将再次未通过测试并被丢弃。重复进行此操作,所有行都未通过WHERE子句的过滤条件,因此被丢弃。

如果你想为行分配ROWNUM,你需要在子查询中实现这一点:

SELECT *                  -- 最后,在外部查询中,根据分配的 ROWNUM 进行过滤
FROM   (
  SELECT t.*,             -- 首先,在内部子查询中,应用 ROWNUM
         ROWNUM AS rn
  FROM   test_table t
)
WHERE  rn > 3;

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

SELECT *                  -- 最后,在外部查询中,根据分配的 ROWNUM 进行过滤
FROM   (
  SELECT t.*,             -- 其次,在下一级子查询中,应用 ROWNUM
         ROWNUM AS rn
  FROM   (
    SELECT *              -- 首先,在最内层子查询中,应用排序
    FROM   test_table
    ORDER BY some_column
  ) t
)
WHERE  rn > 3;

0
0 Comments

在RDBMS中,没有所谓的第一行或最后一行。你所谓的“行”,实际上是集合(sets),它们可以被排序或不排序。rownum是一个函数,它只是对结果集进行编号,只有在计算完集合后才有意义,在调用rownum之前,你必须在查询中告诉数据库在特定的select语句中什么样的顺序。

实现你想要的结果的一种方法是:select * from test_table minus select * from test_table where rownum<=3;

J Muthirenthi的意思是什么?给一些行,哦,不要给太多,给我少3个。RDBMS中的“关系”这个词一定有意义,不是吗?

ROWNUM不是一个函数,它是一个伪列。另外,你不需要指定顺序 - 如果你没有指定,Oracle会按照检索到的行的顺序对行进行编号(这可能导致非确定性的排序)。

“不能同意,是的,根据Oracle文档,rownum是伪列,但将它们视为函数并不是错误。伪列的行为类似于表列,所以它们被称为“伪列”,但实际上它们是以系统函数的方式实现的。

0