【发布时间】:2009-05-12 23:35:03
【问题描述】:
为什么以下查询返回“零”记录:
SELECT * FROM 记录 WHERE rownum >= 5 AND rownum = 5而以下查询返回正确的记录:
SELECT * FROM 记录 WHERE rownum问候,
- 艾希什
【问题讨论】:
-
您始终可以使用减号从整个查询中减去
为什么以下查询返回“零”记录:
SELECT * FROM 记录 WHERE rownum >= 5 AND rownum = 5而以下查询返回正确的记录:
SELECT * FROM 记录 WHERE rownum问候,
- 艾希什
【问题讨论】:
在 Oracle 中,Rownum 值是在查询的过滤阶段之后分配的——它们不是表的行,而是查询结果集的行。
所以返回的第一行将始终为 rownum 1,返回的第二行为 rownum 2,依此类推。
rownum 值只有在赋值后才会递增,所以任何查询都像
select * from t where ROWNUM > 1
将从不返回任何结果。这个查询说“我不想看到返回给我的第一行,只看到后面的那些”,这是一个悖论,所以什么都没有返回。
【讨论】:
ROWNUM 是一个伪列,它的值在查询执行时不可用。因此,您无法根据此列过滤结果。话虽如此,有一些变通方法可以减轻它。请看下面(如果你的结果非常大,不建议使用)。
Select a.* From
(
Select COL1, COL2, ROWNUM RowNumber From MyTable
) a
Where
RowNumber = 5;
【讨论】:
替代方法是使用MINUS
SELECT * FROM records
WHERE ROWNUM <= 10
minus SELECT * FROM records
WHERE ROWNUM <= 5
这将过滤掉非唯一值,因此您最好选择 id。
希望这可以为您节省一些时间。
【讨论】: