Oracle下用rownum进行分页时排序的错乱 .

今天早上用户打电话说系统的排序有问题,仔细看了一下,问题好像是出在ROWNUM这个函数上。

在Oracle下ROWNUM函数是对查询结果按照顺序分配自增行序号,所以很多人都利用这个特点进行分页操作,即rownum between 30 and 60,这种限制返回行数的小窍门在普通情况下都很正常,但如果要对返回结果在进行排序就变得乱套了。

如下查询:

select page.* from
( select rownum page_id,
    id,
    unit_code,
    name,
    code
FROM lb_sys_twork page
WHERE state=1
ORDER BY unit_code,
    code) Page
where page.page_id between 10
       AND 31

这是一个网上很常用的查询模式,虽然我在子查询中加入了ORDER BY unit_code,code,并限制返回记录集的第10条到30条但是返回集并没有按照我所想的那样进行排序,查其原因发现rownum page_id这个伪字段并不是在最终返回结果集中生成,而是在引用它的子查询中已经返回,如此情况,在加了order by后返回的结果集也就不是按照1,2,3。。。这样的顺序排列了。我尝试将rownum page_id放在最外层,如下:

select rownum page_id, page.* from
( select id,
    unit_code,
    name,
    code
FROM lb_sys_twork page
WHERE state=1
ORDER BY unit_code,
    code) Page
where page.page_id between 10
       AND 31

这时查询出现错误,说是找不到Page_id这个字段,我将page_id的字段别名去掉,直接用rownum来做字段,结果集为空。到这时我才恍然大悟为什么把rownum叫做伪字段,rownum是在结果集进行输出时自动加入的一列,按照这种原理,如果你用Where rownum=10来限制返回的行数,将会得到的是一个空结果集,rownum>10等等也不行。看来把rownum放在子集还是放在最外层都不行,难道没办法了吗?

还是Google帮了忙找到了这片文章,其中介绍了MINUS这个减法集合运算符,MINUS是找到两个给定的数据集合之间的差异,即找到一个数据集合,该集合的数据是仅存在于前一个数据集而后一个数据集中不存在的,相当于集合1-集合2,利用此函数,我可以让集合1返回的是前50条数据,而集合2返回的是前30条,50-30就相当于返回的第30-50的数据。查询SQL如下:

SELECT rownum,
     page.*
FROM ( select Page.*
FROM lb_sys_twork page
WHERE page.state=1
ORDER BY unit_code,
    code) Page
WHERE rownum < 50 MINUS SELECT rownum,
     page.*
FROM ( select Page.*
FROM lb_sys_twork page
WHERE page.state=1
ORDER BY unit_code,
    code) Page
WHERE rownum < 30

Oracle下用rownum进行分页时排序的错乱 .

时间: 2024-11-03 15:31:06

Oracle下用rownum进行分页时排序的错乱 .的相关文章

ORACLE中用rownum分页并排序的SQL语句

ORACLE中用rownum分页并排序的SQL语句 以前分页习惯用这样的SQL语句: select * from (select t.*,rownum row_num from mytable t order by t.id) b where b.row_num between 1 and 10 结果发现由于该语句会先生成rownum 后执行order by 子句,因而排序结果根本不对,后来在GOOGLE上搜到一篇文章,原来多套一层select 就能很好的解决该问题,特此记录,语句如下: sel

[Oracle] ROWNUM和分页

rownum是oracle的一个伪劣,它的顺序根据从表中获取记录的顺序递增,这里要注意的是:由于记录在表中是无序存放的,因此你无法通过简单的rownum和order by的组合获得类似TOP N的结果. 我们的测试数据如下: select * from test; ID NAME ---------- -------------------- 1 A 3 C 4 C 8 C 10 D 2 B 5 C 7 C 6 C 9 D 通过rownum<=5可以获得前5行数据: select * from

《转》ORACLE中的rownum(实现真分页的方法)

1 引言 Oracle中的rownum一般是在实现分页查询时用到,虽然在我做的项目中只实现了分页显示而没有实现真正的分页,但是出于学习的目的研究了一下oracle的rownum.在使用查询语句时,我们经常要求返回表中的前n条记录或者是中间的几条记录,比如在一个大表(假设有10W条数据)要求查询从第1000到1005条的记录.面对这种查询,我们怎么办呢?mysql和oracle都有自己的解决办法. 2 MySql中的实现 在mysql中,我们可以使用limit语句来实现: 1)查询从第1000到1

在widows 2008 x64bit R2下安装Oracle db 10.2.0.4时遇到的&quot;检查操作系统版本: 必须是5.1 or 5.2。实际为 6.1未通过&quot;

在Widows 2008 x64bit R2下安装Oracle db 10.2.0.4时遇到的"检查操作系统版本: 必须是5.1 or 5.2.实际为 6.1未通过" 特别说明:Widows 2008 x64bit R2下安装Oracle db 10.2.0.4仅仅是第一步,之后还得打10.2.0.5的patch.原因很简单:Oracle db 10.2.0.4 没有在 Widows 2008 x64bit R2通过认证. 解决方法: database\install\oraparam

转:Oracle中的rownum不能使用大于&gt;的问题

一.对rownum的说明 关于Oracle 的 rownum 问题,很多资料都说不支持SQL语句中的“>.>=.=.between...and”运算符,只能用如下运算符号“<.<=.!=”, 并非说用“>.>=.=.between..and”时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来. 其实,只要理解好了这个 rownum 伪列的意义就不应该感到惊奇. rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的: r

Oracle利用存储过程性 实现分页

分页的简单配置 在上一次已经说过了 这边说说怎么在存储过程中实现分页 首先建立存储过程 参考 http://www.cnblogs.com/gisdream/archive/2011/11/16/2251687.html 基本的代码如下所示 1.在oracle的sqlplus或其他工具中运行一下pl/sql块建立存储过程 ------------------------------------------------------------ --分页存储过程 ------------------

MySQL分页时使用 limit+order by 会出现数据重复问题

1.问题描述 在MySQL中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10条数据,limit(10,10)表示列出第二页.但是,当limit遇到order by的时候,可能会出现翻到第二页的时候,竟然又出现了第一页的记录. SELECT `post_title`, `post_date` FROM post WHERE `post_status` = 'publish' ORDER BY view_count desc LIMIT 5, 5 使用上述SQL

(转)Oracle中的rownum,ROWID的 用法

场景:在书写oracle的sql语句时候,如果语句不存在主键,需要删除几条重复的记录,这个时候如果不知道oracle中的伪列,就需要把所有的重复记录先删除,再插入.这样做好麻烦,可以通过伪列来定位记录. 1 ROWNUM的使用——TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM. ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集).简单的说ROWNUM是符合条件结果的序列号.它总是从1开始排起的

[数据库]Oracle和mysql中的分页总结

物理分页 •在sql查询时,从数据库只检索分页需要的数据 •通常不同的数据库有着不同的物理分页语句 •mysql物理分页,采用limit关键字 •例如:检索11-20条 select * from user limit 10,10 ; * 每次只查询10条记录.当点击下一页的时候,查询数据库,查询后10条. * 优点:如果数据量非常大,不会导致内存溢出. * 缺点:每次都与数据库进行交互. * 分页一般采用数据库的sql语句完成分页查询. * MYSQL分页:使用limit关键字. * Orac