`
qimo601
  • 浏览: 3445915 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Oracle 如何实现第M行至第N行的有序读取,避免子查询order by出错

阅读更多

我的表结构:

表名:WX_REGULAR_MAINTAIN_WORK

表字段:WORK_ID 、SYSTEM_ID....LAST_EXECUT_TIME、MAINTAIN_PERIOD、DELSIGN

 sql语句作用:从前台传递start、limit参数,读取数据表中start行->(start+limit*页数) 行的记录。

 

string sqlCommand =

 @"select * from (select * from WX_REGULAR_MAINTAIN_WORK order by  (LAST_EXECUT_TIME+ MAINTAIN_PERIOD) ASC)
       where DELSIGN = '0' and rownum <= "+limit+@" and   WORK_ID||SYSTEM_ID not in   

( select WORK_ID||SYSTEM_ID 

   from (select * from WX_REGULAR_MAINTAIN_WORK order by (LAST_EXECUT_TIME+ MAINTAIN_PERIOD) ASC)
   where DELSIGN = '0' and rownum <="+start+"  ) ";

  

   order by 用在from里,是为了在已经按照(LAST_EXECUT_TIME+ MAINTAIN_PERIOD)排序数据集里查找记录。

   rownum 是数据库自带的标识符。

 

  第M行->第N行 按照某字段有序读取简单写成:

 

select * from (select * from a order by a.id) where rownum < = N  and a.id not in ( select * from (select * from a order by a.id) where rownum<=M)

  

实践中出现的问题:

    1,Oracle无法在子查询中实现orader by 。总会出现提示“缺少右括号”。

    2,rownum 只有 rownum < 值 或是rownum <= 值的方法。没有>或>=。

    3,MINUS也可以实现读取第M行至第N行的读取,如果想按照有序排列,只需from 一个有序的select集合。

        例如:

(select   *   from   a   where   rownum<=5)   
   minus   
( select   *   from   a   where   rownum<4 ) 

  

 

        改成:

(select   *   from   (select * from a order by a.id)   where rownum<=5  ) 
 minus   
 (select   *   from   (select * from a order by a.id)   where   rownum<4)

 

 

0
0
分享到:
评论

相关推荐

    从N行读到M行的数据sql语句

    为了实现从N行读取到M行的数据,通常需要使用子查询。子查询允许我们在主查询中嵌套另一个查询。在提供的SQL语句中,我们首先创建了一个内部查询,它计算了每一行的行号,并包含了所有原始的列信息。然后,在外部...

    提高Oracle数据库查询效率

    2. **全表扫描**: 使用`SELECT *`会导致数据库执行全表扫描,这意味着需要读取表中的每一行数据,即使只需要部分列的数据也是如此。 3. **模糊匹配**: 使用`first_name || '' || last_name`的方式来进行匹配,可能...

    oracle常用查询

    4. **子查询**:子查询是在主查询内部的嵌套查询,可以用于获取满足特定条件的子集数据,或作为比较值。 5. **分组与排序**:GROUP BY用于按一个或多个列对结果进行分组,HAVING则用于过滤分组后的结果。ORDER BY则...

    Oracle分页(limit方式的运用)

    4. **使用OFFSET与FETCH FIRST**:通过子查询和`WHERE`子句来筛选出指定范围内的记录,并使用`FETCH FIRST`获取前N条记录。 #### 四、Oracle分页的优化技巧 1. **避免全表扫描**:尽可能使用索引来限制查询的范围...

    oracle的rownum用法

    - 若要选择特定范围的行,可以使用子查询和临时变量,例如`SELECT * FROM (SELECT ..., ROWNUM r FROM table WHERE ...) WHERE r BETWEEN m AND n`。 - 避免在`WHERE`子句中使用`ROWNUM`的比较操作,除非你完全理解...

    Oracle 9i用索引跳跃扫描提高查询速度

    索引跳跃式扫描的工作原理是,Oracle 内部会分解查询,生成多个子查询,每个子查询针对索引的不同部分进行操作。例如,对于上述例子,Oracle 实际上执行了两个查询: 1. `SELECT emp_name FROM emp WHERE sex = 'F'...

    Oracle语句优化规则汇总

    4. **减少行处理**:通过LIMIT和ROWNUM限制返回的行数,尤其是在联接和子查询中。这能减少内存占用和处理时间。 5. **合理使用JOIN操作**:避免在JOIN操作中使用笛卡尔积,尽量减少JOIN的数量。使用INNER JOIN代替...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    1.5.6 ORDERBY子句 13 1.6 INSERT语句 14 1.6.1 单表插入 14 1.6.2 多表插入 15 1.7 UPDATE语句 17 1.8 DELETE语句 20 1.9 MERGE语句 22 1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-...

    Oracle Sql基础 Oracle Sql基础 Oracle Sql基础

    - 在使用单行子查询时需要注意处理可能产生的错误,如子查询返回多行或没有返回任何行的情况。 **6.7 多行子查询** - 多行子查询返回多个值,可以使用IN、ANY/SOME、ALL等操作符与之配合使用。 #### 七、操纵数据...

    Oracle--ROWNUM.rar_oracle

    需要注意的是,`ROWNUM`的筛选是在数据读取过程中进行的,而非对整个数据集进行排序后筛选,所以如果你没有指定`ORDER BY`子句,返回的结果顺序可能是不确定的。 在进行分页查询时,`ROWNUM`结合`ROWCOUNT`或者`...

    Oracle Sql基础 宝典系列1

    #### 第6章 子查询 - **子查询介绍**:子查询是在另一个查询内部的查询。它可以放在 `WHERE`、`HAVING` 或者 `FROM` 子句中。 - **使用子查询的原则**:子查询应返回与主查询兼容的结果集。 - **子查询分类**:包括...

    Oracle数据库中的索引管理技术.pdf

    第四,在使用 ORDER BY 和 GROUP BY 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化器,提高系统的性能。正是因为上述原因,所以应该对表增加索引...

    SQL分页读取海量数据存储过程

    3. 使用子查询或临时表:在某些数据库系统中,可以先计算出总行数,再进行分页查询,以减少`OFFSET`的影响。 五、其他分页技巧 1. ROW_NUMBER()函数:SQL Server和Oracle支持ROW_NUMBER()函数,可以为每一行生成一...

    Oracle性能优化

    8. **避免在索引列上使用ORDER BY**:如果ORDER BY的列是索引的一部分,Oracle可能无法使用索引进行排序,导致性能下降。 9. **批量操作**:使用BULK COLLECT和FORALL语句进行批量插入、更新或删除,减少数据库调用...

    oracle如何查看很耗时的sql.txt

    例如,避免使用子查询,减少全表扫描等。 3. **调整缓存策略**:如果发现缓存命中率较低,可能需要调整Oracle的缓存策略,确保经常使用的数据被保留在内存中。 #### 四、总结 通过上述方法,我们可以有效地找到并...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

    Oracle经验集锦

    SELECT column_name FROM (SELECT *, DENSE_RANK() OVER (ORDER BY column DESC) rank FROM table_name) WHERE rank = N; ``` - **分页查询**:在Oracle中,`ROWNUM` 是一个虚拟列,用于对查询结果进行排序和分页...

    ORACLE-OCP-071考试题目和答案附带解析

    2. **组件查询不能单独排序**:每个参与复合查询的子查询不能拥有独立的`ORDER BY`子句。 3. **识别列名**:`ORDER BY`子句仅能识别第一个`SELECT`语句中的列名或位置。这意味着如果需要对后续查询中的列进行排序,...

Global site tag (gtag.js) - Google Analytics