Oracle分页

------------------转改--------------------

 

Oracle原来可以这样实现分页功能:
select * from t_table where rowid not in(select rowid from t_table where rownum<=200) and rownum<=200
上述语句实现了从第201条记录开始处取200条记录

 

 

都知道使用oracle的rownum能实现分页显示的功能,先对rownum做了些归纳,希望能跟大家一起分享。
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。


举例说明:
例如表:student(学生)表,表结构为:
ID           VARCHAR2(6)    --学号
name    VARCHAR2(10)   --姓名
create table student

(

ID VARCHAR2(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;

 

结果显示:
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 >2;

结果显示:

ROWNUM        ID               NAME


那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

-------------------------------------------------------------------------------------------
例:SQL>select * from(select rownum no ,id,name from student) where no>2;

结果显示:
NO                 ID              NAME
3                   200003      李三
4                   200004      赵四

---------------------------------------------------------------------------------------------
例:SQL> select * from(select rownum,id,name from student)where rownum>2;
结果显示:
ROWNUM ID      NAME

(3)rownum对于小于某值的查询条件
如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。

-----------------------------------------------------------------------------
例:SQL> select rownum,id,name from student where rownum <3;
结果显示:
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 >=2;
结果显示:

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标出正确序号(由小到大)

 

 

 

@@@@@@@@@@@@@这里有之前做的一个项目的部分代码以供参考:@@@@@@@@@@@@@@@@@@

 

----------------------------------------------------------------------------------------------

1.查询符合条件的记录数,

StringBuffer sql = new StringBuffer();

  sql.append("select * from ( ");
  sql.append("  SELECT A.*, rownum rn from ( ");
  sql.append("     select * from NETB_TERMINAL t where 2>1 ");

 

//如果是查总数的话就把这句换上

//sql.append("select count(1) from NETB_TERMINAL t where 2>1 ");

 

//拼条件开始--------------------------

  
  if(terminalCond.getFlag()!=null&&"gr".equals(terminalCond.getFlag()))
  {
   sql.append(" and (t.flag = '00' or t.flag='11') ");
  }
  else if(terminalCond.getFlag()!=null&&"zq".equals(terminalCond.getFlag()))
  {
   sql.append(" and (t.flag = '01' or t.flag='11') ");
  }
  
  if (terminalCond.getBrandCode() != null
    && !"".equals(terminalCond.getBrandCode())) {
   sql.append(" and (t.BRANDCODE = '");
   for (int i = 0; i < terminalCond.getBrandCode().length - 1; i++) {

    sql.append(terminalCond.getBrandCode()[i]);
    sql.append("' or t.BRANDCODE = '");

   }
   sql
     .append(terminalCond.getBrandCode()[terminalCond
       .getBrandCode().length - 1]);
   sql.append("')");

  }

  if (terminalCond.getStyleCode() != null
    && !"".equals(terminalCond.getStyleCode())) {
   sql.append(" and (t.STYLECODE like '%");
   for (int i = 0; i < terminalCond.getStyleCode().length - 1; i++) {

    sql.append(terminalCond.getStyleCode()[i]);
    sql.append("%' or t.STYLECODE like '%");

   }
   sql
     .append(terminalCond.getStyleCode()[terminalCond
       .getStyleCode().length - 1]);
   sql.append("%')");

  }
  // System.out.println("fddasd ");
  if (terminalCond.getColorCode() != null
    && !"".equals(terminalCond.getColorCode())) {
   sql.append(" and (t.COLORCODE like '%");
   for (int i = 0; i < terminalCond.getColorCode().length - 1; i++) {
    sql.append(terminalCond.getColorCode()[i]);
    sql.append("%' or t.COLORCODE like '%");
   }
   sql
     .append(terminalCond.getColorCode()[terminalCond
       .getColorCode().length - 1]);
   sql.append("%')");
  }
  if (terminalCond.getFunctionsCode() != null
    && !"".equals(terminalCond.getFunctionsCode())) {
   sql.append(" and (t.FUNCTIONSCODE like '%");
   for (int i = 0; i < terminalCond.getFunctionsCode().length - 1; i++) {
    sql.append(terminalCond.getFunctionsCode()[i]);
    sql.append("%' or t.FUNCTIONSCODE like '%");
   }
   sql.append(terminalCond.getFunctionsCode()[terminalCond
     .getFunctionsCode().length - 1]);
   sql.append("%')");
  }

  if (terminalCond.getPriceSort() != null
    && terminalCond.getPriceSort().equals("1")) {
   sql.append(" order by t.PRICE asc");
  } else if (terminalCond.getPriceSort() != null
    && terminalCond.getPriceSort().equals("-1")) {
   sql.append(" order by t.PRICE desc");
  }
  if (terminalCond.getQuantitySort() != null
    && terminalCond.getQuantitySort().equals("1")) {
   sql.append(" order by t.SALE_QUANTITY asc");
  }

  else if (terminalCond.getQuantitySort() != null
    && terminalCond.getQuantitySort().equals("-1")) {
   sql.append(" order by  t.SALE_QUANTITY desc");
  }
  
  if("0".equals(terminalCond.getPriceSort())&& "0".equals(terminalCond.getQuantitySort()))
  {
   sql.append(" order by  t.id asc");
  }

 


  //拼条件结束-----------------------------------------------------------------

 

 

 

  sql.append(") A where rownum <=" + page.getCurrentPage()
    * page.getCountPerPage());
  sql.append(") ");
  sql.append("where rn>" + (page.getCurrentPage() - 1)
    * page.getCountPerPage());
  System.out.print("sql================:" + sql.toString());

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值