3

我观察到 rownum 可以按如下方式使用:

1)  select * from emp where rownum<5;
2)  select * from emp where rownum<=5;
3)  select * from emp where rownum=1;

所有这些查询都返回预期的输出。假设表 emp 有 7 行,那么第一个查询返回 4 行,第二个返回 5 行,第三个返回 1 行。但是当我尝试使用类似的东西时:

4)  select * from emp where rownum=5;
5)  select * from emp where rownum>5;
6)  select * from emp where rownum>=5;
7)  select * from emp where rownum between 5 and 10;

在所有这些情况下,它返回 0 行。为什么会这样?这有什么具体原因吗?

4

2 回答 2

6

这是因为 rownum 是一个伪列,它会在应用 where 子句后计算结果集中的行数。

来自Oracle 文档:-

大于正整数的 ROWNUM 值的条件测试始终为假。例如,此查询不返回任何行:

SELECT *
  FROM employees
  WHERE ROWNUM > 1;

提取的第一行被指定为 1 的 ROWNUM 并使条件为假。要获取的第二行现在是第一行,并且还分配了 1 的 ROWNUM 并使条件为假。随后所有行都不满足条件,因此不返回任何行。

您还可以使用 ROWNUM 为表的每一行分配唯一值,如下例所示:

UPDATE my_table
  SET column1 = ROWNUM;

您可能会发现这些参考资料很有帮助:-

于 2013-10-27T10:03:34.647 回答
3

你可以做类似这样的事情:

select * from (
  select
    emp.*,
    row_number() over (order by fieldname) as rnum
  from emp
) tmp
where
  rnum between 5 and 10;
于 2013-10-27T09:57:21.300 回答