oracle中取指定行是利用一个参数rownum,例如,取前10行数据的代码就是:
select * from tablea where rownum < 10
那么取中间几行是不是就把rownum < 10改为rownum > 10 and rownum < 20呢?
尝试运行,会发现有异常!!!!然后,我们就需要学习rownum 的真正含义,以及如何使用了。
先好好理解 rownum 的意义吧。因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。所以没办法期望得到下面的结果集:
11 aaaaaaaa
12 bbbbbbb
13 ccccccc
.................
rownum >10 没有记录,因为第一条不满足去掉的话,第二条的rownum又成了1,所以永远没有满足条件的记录。或者可以这样理解:rownum是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类 推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除, 接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1.
如果就是想要用 rownum > 10 这种条件的话,就要用嵌套语句,把 rownum 先生成,然后对他进行查询。
select * from (select rownum as rn,t1.* from tablea t1 where ...) tab where tab.rn >10
类似的如果想要取中间几行数据的话,sql语句就应该这么写:select * from (selet rownum as rn,t1.* from tablea t1 where ...) tab where tab.rn >10 and tab.rn < 20