Oracle / SQL:为什么查询“SELECT * FROM records WHERE rownum> = 5 AND rownum< = 10” - 返回零行

时间:2009-05-12 23:35:03

标签: sql oracle

为什么以下查询返回“零”记录:

SELECT * FROM records WHERE rownum >= 5 AND rownum <= 10

     OR

SELECT * FROM records WHERE rownum >= 5 

以下查询返回正确的记录:

SELECT * FROM records WHERE rownum <= 15

的问候,
- Ashish

3 个答案:

答案 0 :(得分:32)

在Oracle中,Rownum值是在查询的过滤阶段之后分配的 - 它们不是表的行,它们是查询结果集的行。

因此,返回的第一行将始终为rownum 1,第二行将返回rownum 2,等等。

rownum值仅在分配后递增,因此任何查询都会像

一样
select * from t where ROWNUM > 1

永远不会返回任何结果。这个查询说'我不想看到第一行返回给我,只有那之后的那些',这是一个悖论,因此没有任何东西被返回。

有关详细信息,请参阅Ask Tom:On ROWNUM and Limiting Results

答案 1 :(得分:1)

ROWNUM是一个伪列,它的值在查询执行时将不可用。因此,您无法根据此列过滤结果。话虽如此,有一些工作可以减轻它。请参阅下文(如果结果非常大,建议不要使用。)

Select a.* From 
(
  Select COL1, COL2, ROWNUM RowNumber From MyTable
) a
Where
   RowNumber = 5;

答案 2 :(得分:1)

替代方法是使用MINUS

SELECT * FROM records 
WHERE   ROWNUM <= 10
minus SELECT * FROM records 
WHERE   ROWNUM <= 5

这将过滤掉非唯一值,因此您最好选择ID。

希望这可以节省你一些时间。