欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

oracle提取前几行|中间几行|后几行 有大用

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

 参考文章:https://www.cnblogs.com/szlbm/p/5806070.html

转载于:https://my.oschina.net/u/3636678/blog/2877994

来自 https://blog.csdn.net/weixin_33933118/article/details/92395793


普通分类: