解析oracle的rownum(转载)ITeye - 千亿集团

解析oracle的rownum(转载)ITeye

2019年03月26日08时21分46秒 | 作者: 梦蕊 | 标签: 查询,记载,运用 | 浏览: 1720

  自己最近在运用oracle的rownum完成分页显现的时分,对rownum做了进一步的剖析和研讨。现归纳如下,期望能给咱们带来收成。
  关于rownum来说它是oracle体系次序分配为从查询回来的行的编号,回来的榜首行分配的是1,第二行是2,依此类推,这个伪字段能够用于约束查询回来的总行数,而且rownum不能以任何表的称号作为前缀。
举例说明:
例如表:student(学生)表,表结构为:
ID   char(6) 学号
name VARCHAR2(10) 名字
create table student (ID char(6), name VARCHAR2(100));
insert into sale values(200001,‘张一’);
insert into sale values(200002,‘王二’);
insert into sale values(200003,‘李三’);
insert into sale values(200004,‘赵四’);
commit;
(1) rownum 关于等于某值的查询条件
假如期望找到学生表中榜首条学生的信息,能够运用rownum=1作为条件。可是想找到学生表中第二条学生的信息,运用rownum=2成果查不到数据。由于rownum都是从1开端,可是1以上的自然数在rownum做等于判别是时以为都是false条件,所以无法查到rownum = n(n 1的自然数)。
SQL select rownum,id,name from student where rownum=1;(能够用在约束回来记载条数的当地,确保不犯错,如:隐式游标)
SQL select rownum,id,name from student where rownum=1;
  ROWNUM ID  NAME
-
  1 200001 张一
SQL select rownum,id,name from student where rownum =2;
  ROWNUM ID  NAME
-
(2)rownum关于大于某值的查询条件
  假如想找到从第二行记载今后的记载,当运用rownum 2是查不出记载的,原因是由于rownum是一个总是从1开端的伪列,Oracle 以为rownum n(n 1的自然数)这种条件仍旧不建立,所以查不到记载
SQL select rownum,id,name from student where rownum
ROWNUM ID  NAME
-
那怎么才干找到第二行今后的记载呀。能够运用以下的子查询方法来处理。留意子查询中的rownum有必要要有别号,不然仍是不会查出记载来,这是由于rownum不是某个表的列,假如不起别号的话,无法知道rownum是子查询的列仍是主查询的列。
SQL select * from(select rownum no ,id,name from student) where no
  NO ID  NAME
-
  3 200003 李三
  4 200004 赵四
SQL select * from(select rownum,id,name from student)where rownum
  ROWNUM ID  NAME
-
(3)rownum关于小于某值的查询条件
假如想找到第三条记载曾经的记载,当运用rownum 3是能得到两条记载的。明显rownum关于rownum n((n 1的自然数)的条件以为是建立的,所以能够找到记载。
SQL select rownum,id,name from student where rownum
  ROWNUM ID  NAME
-
1 200001 张一
  2 200002 王二
综上几种状况,或许有时分需求查询rownum在某区间的数据,那怎么办呀从上能够看出rownum对小于某值的查询条件是人为true的,rownum关于大于某值的查询条件直接以为是false的,可是能够直接的让它转为以为是true的。那就有必要运用子查询。例如要查询rownum在第二行到第三行之间的数据,包含第二行和第三行数据,那么咱们只能写以下句子,先让它回来小于等于三的记载行,然后在主查询中判别新的rownum的别号列大于等于二的记载行。可是这样的操作会在大数据会集影响速度。
SQL select * from (select rownum no,id,name from student where rownum =3 ) where no
  NO ID  NAME
-
  2 200002 王二
  3 200003 李三
(4)rownum和排序
Oracle中的rownum的是在取数据的时分发生的序号,所以想对指定排序的数据去指定的rowmun行数据就有必要留意了。
SQL select rownum ,id,name from student order by name;
  ROWNUM ID  NAME
-
  3 200003 李三
  2 200002 王二
  1 200001 张一
  4 200004 赵四
能够看出,rownum并不是依照name列来生成的序号。体系是依照记载插入时的次序给记载排的号,rowid也是次序分配的。为了处理这个问题,有必要运用子查询
SQL select rownum ,id,name from (select * from student order by name);
  ROWNUM ID  NAME
-
  1 200003 李三
  2 200002 王二
  3 200001 张一
  4 200004 赵四
这样就成了按name排序,而且用rownum标出正确序号(有小到大)


PS:别的,orcle的rownum是先进行查询,然后对查询出来的成果进行rownum排序的在实际运用时分遇到了这样问题:(原先想查出15条数据)
  在运用:
  select t_sn.* from stock_no t_sn where ![CDATA[rownum = #num# and  t_sn.status=1]] and t_sn.stock_code = #stockCode# order by rownum
的时分只要10条;
  改善:
  select t.*
  from (select t_sn.*, rownum as rn
  from stock_no t_sn
  where ![CDATA[t_sn.status = 1]]
  and t_sn.stock_code = #stockCode#) t
where ![CDATA[t.rn = #num#]]
order by rownum
  成果正确!!!!
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章