为什么以下查询返回“零”记录:
SELECT * FROM records WHERE rownum >= 5 AND rownum <= 10 OR SELECT * FROM records WHERE rownum >= 5
以下查询返回正确的记录:
SELECT * FROM records WHERE rownum <= 15
的问候,
- Ashish
答案 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。
希望这可以节省你一些时间。