为什么我们不能在oracle中使用条件rownum = 5

时间:2013-10-27 09:52:36

标签: sql oracle

我发现rownum可以按如下方式使用:

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

所有这些查询都会返回预期的输出。假设表emp有7行,则第1个查询返回4行,第2个返回5行,第3个返回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行。为什么会这样?这有什么具体原因吗?

2 个答案:

答案 0 :(得分:4)

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

来自Oracle docs: -

  

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

SELECT *
  FROM employees
  WHERE ROWNUM > 1;

为获取的第一行分配ROWNUM为1并使条件为false。要获取的第二行现在是第一行,并且还被赋予ROWNUM为1并使条件为false 。所有行随后都无法满足条件,因此不返回任何行。

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

UPDATE my_table
  SET column1 = ROWNUM;

您可能会发现这些参考资料有用: -

答案 1 :(得分:3)

你可以做类似的事情:

select * from (
  select
    emp.*,
    row_number() over (order by fieldname) as rnum
  from emp
) tmp
where
  rnum between 5 and 10;