SQL> select * from scott.emp where rowid in(
select rid from (
select rownum rn,rid from (
select rowid rid,empno from scott.emp order by empno desc)
where rownum<10)
where rn > 6)
order by empno desc;
请复制下面代码,可直接执行,和上面是一样的
select * from scott.emp where rowid in(select rid from (select rownum rn,rid from (select rowid rid,empno from scott.emp order by empno desc) where rownum<10) where rn > 6) order by empno desc;
不懂的再看这个
oracle的分页是通过rownum实现的。
rownum是一个伪列,是oracle系统自动为查询返回结果的每行分配的编号,第一行为1,第二行为2,以此类推。。。。
一个oracle分页,至少要包含三层(除非不用order by,暂时可以用2层实现),模板为
select temp2.* from(
select rownum num,temp1.* from(
SQL查询
) temp1 where rownum<=n1
)temp2 where temp2.num>n2
例如:值返回查询结果第11条到20条着10条的信息的SQL如下:
select temp2.*
from(
select rownum num,temp1.*
from(
select tt.title_id,tt.name
from t_title tt
where tt.name like '%美%'
order by tt.sort_seqs asc,tt.title_Id desc) temp1
where rownum<=20
)temp2
where temp2.num>10
分析:
1.首先是一个正常的查询语句(包含order by)
select tt.title_id,tt.name
from t_title tt
where tt.name like '%美%'
order by tt.sort_seqs asc,tt.title_Id desc
这个和正常的SQL语句没有任何的区别
2.添加rownum字段,显示列数
select rownum num,temp1.*
from(
select tt.title_id,tt.name
from t_title tt
where tt.name like '%美%'
order by tt.sort_seqs asc,tt.title_Id desc) temp1
where rownum<=20
我们添加了rownum 显示字段,这时候就会会每行添加一个行数的编号;并且只返回20条之前的数据(包含20条)
3.截取第10条到20条的数据,SQL就是:
select temp2.*
from(
select rownum num,temp1.*
from(
select tt.title_id,tt.name
from t_title tt
where tt.name like '%美%'
order by tt.sort_seqs asc,tt.title_Id desc) temp1
where rownum<=20
)temp2
where temp2.num>10