`
学会做人
  • 浏览: 121218 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
阅读更多
使用三层嵌套正确实现Oracle分页:+++++++++++++++++++++++++++++++++++++++
原始记录:
select t.*, t.rowid from t_stu t
order by t.s_birthday desc
返回:
STU_ID S_NAME C_ID S_BIRTHDAY
S0002 李四   C01 1989-3-21
S0036 张36   C02 1983-8-10
S0035 张35   C02 1983-8-9
S0034 张34   C02 1983-8-8
S0033 张33   C02 1983-8-7
Oracle分页查询:
第一种:两层嵌套查询(网上流行的一种错误)
select * from
(
  select rownum r,t.* from t_stu t
)
where r between 1 and 3 order by s_birthday desc
返回:
R STU_ID S_NAME C_ID S_BIRTHDAY
2 S0002 李四   C01 1989-3-21
3 S0003 张三丰 C02 1983-7-9
1 S0001 张三   C01 1980-1-13
说明:上面的结果可能与你的不一样,因为Oracle在没有order by的情况,是随机选取记录的。前3名的记录应该是:
STU_ID S_NAME C_ID S_BIRTHDAY
S0002 李四   C01 1989-3-21
S0036 张36   C02 1983-8-10
S0035 张35   C02 1983-8-9
第二种:换用三层嵌套查询:
select b.* from
(select rownum r,a.* from
(select t.* from t_stu t order by s_birthday desc )a
)b
where b.r between 1 and 3
返回:
R STU_ID S_NAME C_ID S_BIRTHDAY
1 S0002 李四   C01 1989-3-21
2 S0036 张36   C02 1983-8-10
3 S0035 张35   C02 1983-8-9
正确!
所以Oracle分布查询一定要用三层嵌套,步骤如下:
--第三层:分页过滤
select b.*
  from (
      --第二层:给定行号
    select rownum r,a.* from (
      --第一层:排序
      select * from 表 order by 字段
    ) a
    where rownum<=最大行
)b
where b.r between 最小行 and 最大行

★★★关键点:先排序,后给行号,两个步骤要分开!
为了程序的通用性,对任意数据集都能分页,利用子查询改为如下结构:
--第三层:分页过滤
select b.*
  from (
      --第二层:给定行号
    select rownum r,a.* from (
      --第一层:排序
      select * from (一个已经排序的数据集)
    ) a
    where rownum<=最大行
)b
where b.r between 最小行 and 最大行
如上面的查询改为:
--第三层:分页过滤
select b.*
  from (
      --第二层:给定行号
    select rownum r,a.* from (
      --第一层:排序
      select * from (select t.* from t_stu t order by s_birthday desc)
    ) a
    where rownum<=最大行
)b
where b.r between 最小行 and 最大行
或者其它查询语句:
--第三层:分页过滤
select b.*
  from (
      --第二层:给定行号
    select rownum r,a.* from (
      --第一层:排序
      select * from (select t.* from  新闻表 t order by 发贴日期 desc)
    ) a
    where rownum<=最大行
)b
where b.r between 最小行 and 最大行
★原始数据数据脚本(请在命令窗口中粘贴以下语句即可):
prompt PL/SQL Developer import file
prompt Created on 2008年8月18日 星期一 by Administrator
set feedback off
set define off
prompt Dropping T_STU...
drop table T_STU cascade constraints;
prompt Creating T_STU...
create table T_STU
(
  STU_ID     CHAR(5),
  S_NAME     CHAR(6),
  C_ID       CHAR(3),
  S_BIRTHDAY DATE,
  S_SEX      CHAR(1)
)
;
prompt Disabling triggers for T_STU...
alter table T_STU disable all triggers;
prompt Loading T_STU...
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0001', '张三  ', 'C01', to_date('13-01-1980', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0002', '李四  ', 'C01', to_date('21-03-1989', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0003', '张三丰', 'C02', to_date('09-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0004', '张4   ', 'C02', to_date('09-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0005', '张5   ', 'C02', to_date('10-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0006', '张6   ', 'C02', to_date('11-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0007', '张7   ', 'C02', to_date('12-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0008', '张8   ', 'C02', to_date('13-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0009', '张9   ', 'C02', to_date('14-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0010', '张10  ', 'C02', to_date('15-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0011', '张11  ', 'C02', to_date('16-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0012', '张12  ', 'C02', to_date('17-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0013', '张13  ', 'C02', to_date('18-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0014', '张14  ', 'C02', to_date('19-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0015', '张15  ', 'C02', to_date('20-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0016', '张16  ', 'C02', to_date('21-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0017', '张17  ', 'C02', to_date('22-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0018', '张18  ', 'C02', to_date('23-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0019', '张19  ', 'C02', to_date('24-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0020', '张20  ', 'C02', to_date('25-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0021', '张21  ', 'C02', to_date('26-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0022', '张22  ', 'C02', to_date('27-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0023', '张23  ', 'C02', to_date('28-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0024', '张24  ', 'C02', to_date('29-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0025', '张25  ', 'C02', to_date('30-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0026', '张26  ', 'C02', to_date('31-07-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0027', '张27  ', 'C02', to_date('01-08-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0028', '张28  ', 'C02', to_date('02-08-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0029', '张29  ', 'C02', to_date('03-08-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0030', '张30  ', 'C02', to_date('04-08-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0031', '张31  ', 'C02', to_date('05-08-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0032', '张32  ', 'C02', to_date('06-08-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0033', '张33  ', 'C02', to_date('07-08-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0034', '张34  ', 'C02', to_date('08-08-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0035', '张35  ', 'C02', to_date('09-08-1983', 'dd-mm-yyyy'), null);
insert into T_STU (STU_ID, S_NAME, C_ID, S_BIRTHDAY, S_SEX)
values ('S0036', '张36  ', 'C02', to_date('10-08-1983', 'dd-mm-yyyy'), null);
commit;
prompt 36 records loaded
prompt Enabling triggers for T_STU...
alter table T_STU enable all triggers;
set feedback on
set define on
prompt Done.
分享到:
评论

相关推荐

    Java Oracle实现分页功能.pdf

    Java Oracle实现分页功能.pdf 本文主要介绍了如何使用Java语言与Oracle数据库实现分页功能,包括如何编写存储过程、如何使用Java调用存储过程等内容。 首先,文章介绍了分页的必要性,提到在许多情况下需要进行...

    oracle实现分页

    在Oracle数据库中实现分页查询是一项常见的需求,特别是在开发Web应用程序时,为了提高用户体验,通常需要展示大量的数据,并且能够按页浏览。本篇将详细讲解如何使用Oracle SQL语句来实现分页功能。 首先,我们...

    mybatis中oracle实现分页效果实例代码

    MyBatis中Oracle实现分页效果实例代码 MyBatis是一款流行的持久层框架,能够帮助开发者快速实现数据库交互操作。其中,分页查询是常见的数据库操作之一。下面,我们将详细介绍MyBatis中Oracle实现分页效果实例代码...

    ssh+oracle分页

    在Oracle分页中,Hibernate通过HQL(Hibernate Query Language)或SQL来执行查询,并支持Criteria、Query和Session的Criteria API等方式实现分页。通常,我们会通过设置`setFirstResult`和`setMaxResults`方法来指定...

    Oracle实现分页查询的SQL语法汇总

    本文将详细介绍Oracle实现分页查询的几种SQL语法。 1. **无ORDER BY排序的写法** 这种方法适用于无需特定排序顺序的情况,效率最高。在查询时,它创建一个子查询,将ROWNUM伪列与实际数据结合,然后在外层查询中...

    使用jdbc_oracle实现的分页功能

    本示例着重讲解如何利用JDBC和Oracle数据库实现分页功能,同时涵盖一个表的基本操作:增加、删除和修改。 首先,我们需要了解JDBC。JDBC是Java API,它提供了一套标准接口,使得Java程序可以与各种类型的数据库进行...

    oracle-jdbc分页实现(只需传入sql语句即可实现分页)

    Oracle数据库提供了多种方法来实现分页查询,其中包括使用ROWNUM伪列、游标(CURSOR)以及Oracle的高级分页功能如ROW_NUMBER()、RANK()和DENSE_RANK()等。 1. ROWNUM伪列: ROWNUM是Oracle数据库特有的一个伪列,它...

    oracle分页程序的实现

    以下将详细介绍Oracle数据库中实现分页查询的方法以及相关知识点。 在Oracle数据库中,常见的分页查询方法有ROWNUM和ROW_NUMBER()函数,以及使用子查询和连接操作来实现分页。 1. ROWNUM方法: ROWNUM是Oracle中的...

    Oracle分页(limit方式的运用)

    Oracle数据库作为业界广泛使用的数据库系统之一,在实现分页查询方面提供了多种方法。其中一种常用的方法就是使用`LIMIT`子句(尽管Oracle数据库本身不直接支持标准SQL中的`LIMIT`关键字,但可以通过其他方式模拟其...

    Oracle的SQL分页实践

    使用JDBC时,可以结合LIMIT和OFFSET子句(Oracle不支持LIMIT,但可以通过ROWNUM模拟)来实现分页,而在Hibernate中,可以使用Criteria API或HQL的`setFirstResult`和`setMaxResults`方法来实现相同的功能。...

    SSH+ORACLE好用分页

    使用Hibernate的Criteria或HQL查询语言,配合PageHelper或者自己实现的分页逻辑,可以轻松实现分页查询。 3. **定义Service层**:在业务服务层,调用DAO层的分页查询方法,传入当前页数和每页显示的记录数,获取到...

    oracle的分页查询

    在 Oracle 中,ROWNUP 伪列是一个特殊的列,可以用来实现分页查询。例如,我们可以使用以下语句来查询前三个行: ```sql Select * from table1 where rownum ; ``` 这将返回表 table1 中的前三个行。但是,如果...

    jsp+oracle实现简单的分页

    实现分页功能通常涉及以下步骤: 1. 计算总页数:通过查询表中记录总数除以每页显示的记录数得到。 2. 获取当前页的数据:使用`LIMIT`和`OFFSET`(在Oracle中通常用`ROWNUM`和子查询实现)来限制返回的数据量。 3. ...

    kettle oracle循环分页迁移数据的完整例子,生成txt后FTP上传到远程服务器

    Kettle中的“生成分页.ktr”可能就是实现这个功能的工作流,通过设置页码和每页大小来逐次获取数据。 4. **数据迁移**:“根据当前页码输出到txt.ktr”工作流可能是将从Oracle数据库中获取的分页数据转化为TXT格式...

    sturts+oracle+jdbc实现分页

    本文将深入探讨如何使用Struts、Oracle数据库和JDBC技术实现分页功能,以提高应用程序的性能和用户体验。 首先,我们要了解分页的基本概念。分页是一种将大量数据分割成多个小部分(页)进行展示的技术,使得用户...

    oracle 分页完整代码

    例如,在Hibernate中,我们可以利用`CriteriaQuery`或`Query`对象的`setFirstResult()`和`setMaxResults()`方法来实现分页。 总之,Oracle的分页可以通过ROWNUM伪列配合Java的JDBC实现,也可以借助ORM框架进行更...

    java oracle数据库过程实现jsp分页

    以上就是通过Java、Oracle存储过程和JSP实现分页的基本流程。在实际项目中,可能还需要考虑更多细节,如错误处理、性能优化(如使用索引、避免全表扫描)以及用户体验优化(如加载提示、动态加载等)。理解并掌握这...

    Oracle&JSP分页和Oracle分页

    总结来说,Oracle和JSP结合实现分页涉及以下几个步骤:在Oracle中构造分页查询,使用JDBC在Servlet中执行查询,然后在JSP页面中展示数据。理解并熟练掌握这些步骤对于开发高效、用户友好的数据驱动网站至关重要。在...

    oracle sql分页语句

    在Oracle数据库系统中,实现分页查询通常使用ROWNUM伪列或者结合RANK()、DENSE_RANK()、ROW_NUMBER()等窗口函数。这里我们将详细探讨这些方法及其应用场景。 首先,ROWNUM是一个特殊的伪列,它在查询执行时为每一行...

Global site tag (gtag.js) - Google Analytics