ROWNUM:
说明:rownum是一个伪字段,标示查询字段的序号;
使用:
select rownum 序号 from table
注意:
一、
rownum 使用 '>' 号的问题
select * from emp where rownum>3、
查询不到结果
原因:
rownum是在使用select查询的时候,自动生成的一串顺序号。
在每返回一条数据结果的时候,rownum就自动加一
当select 一条数据 rownum 为 1 不>3 记录被筛去
而下一条 数据 rownum 又是 1.。。。。。。。
解决:加一层嵌套
二、
rownum 与 order by 同时使用会出现问题
rownum 是不支持order by 排序的。因为rownum是在排序之前取值的。
"在oracle中如果rownum与order by同在,是先rownum,然后再order by "
oracle手册上说的:“即使select语句中一条简单的order by都可能会搞乱ROWNUM(因为ROWNUM是排序前分配给各行的)
如图所示:(RN 列顺序错误
)
解决方式:
1、直接嵌套:
(增加了两次查询,被嵌套的查询结果相当于视图,view中已经有rownum字段 所以可以使用 > 号)
select t2.* from( --解决>号问题
select t1.*,ROWNUM rn from ( --解决order by 的影响
select
k.bmxh,
k.byxxdm,
z.zgdm,
z.dqdm,
zd.zgmc,
zd.fz
from zgjf z
left join ks k on z.bmxh = k.bmxh
left join zgdm zd on z.zgdm = zd.zgdm
order by bmxh asc, z.zgdm asc
)t1
)t2 where rn > 2 and rn <10
2、使用 : row_number() over(order by COLUMN_NAME) 改变顺序,先执行了括号中的order by
select
z.* ,row_number()
over
(
order
by
z.bmxh ) rn
from
zgjf z
where
rownum
<
10
and
rownum
>
5