`
cuker919
  • 浏览: 103162 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle Top N 和 Oracle中的limit问题解决方案

 
阅读更多

oracle top N

1.在ORACLE中实现SELECT TOP N

由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询。

简单地说,实现方法如下所示:

SELECT 列名1...列名n FROM

(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)

WHERE ROWNUM <= N(抽出记录数)

ORDER BY ROWNUM ASC

下面举个例子简单说明一下。

顾客表customer(id,name)有如下数据:

ID NAME

01 first

02 Second

03 third

04 forth

05 fifth

06 sixth

07 seventh

08 eighth

09 ninth

10 tenth

11 last

则按NAME的字母顺抽出前三个顾客的SQL语句如下所示:

SELECT * FROM

(SELECT * FROM CUSTOMER ORDER BY NAME)

WHERE ROWNUM <= 3

ORDER BY ROWNUM ASC

输出结果为:

ID NAME

08 eighth

05 fifth

01 first

2.在TOP N纪录中抽出第M(M <= N)条记录

在得到了TOP N的数据之后,为了抽出这N条记录中的第M条记录,我们可以考虑从ROWNUM着手。我们知道,ROWNUM是记录表中数据编号的一个隐藏子段,所以可以在得到TOP N条记录的时候同时抽出记录的ROWNUM,然后再从这N条记录中抽取记录编号为M的记录,即使我们希望得到的结果。

从上面的分析可以很容易得到下面的SQL语句。

SELECT 列名1...列名n FROM

(

SELECT ROWNUM RECNO, 列名1...列名nFROM

(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)

WHERE ROWNUM <= N(抽出记录数)

ORDER BY ROWNUM ASC

)

WHERE RECNO = M(M <= N)

同样以上表的数据为基础,那么得到以NAME的字母顺排序的第二个顾客的信息的SQL语句应该这样写:

SELECT ID, NAME FROM

(

SELECT ROWNUM RECNO, ID, NAME FROM

(SELECT * FROM CUSTOMER ORDER BY NAME)

WHERE ROWNUM <= 3

ORDER BY ROWNUM ASC )

WHERE RECNO = 2

结果则为:

ID NAME

05 fifth

3.抽出按某种方式排序的记录集中的第N条记录

在2的说明中,当M = N的时候,即为我们的标题讲的结果。实际上,2的做法在里面N>M的部分的数据是基本上不会用到的,我们仅仅是为了说明方便而采用。

如上所述,则SQL语句应为:

SELECT 列名1...列名n FROM

(

SELECT ROWNUM RECNO, 列名1...列名nFROM

(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)

WHERE ROWNUM <= N(抽出记录数)

ORDER BY ROWNUM ASC

)

WHERE RECNO = N

那么,2中的例子的SQL语句则为:

SELECT ID, NAME FROM

(

SELECT ROWNUM RECNO, ID, NAME FROM

(SELECT * FROM CUSTOMER ORDER BY NAME)

WHERE ROWNUM <= 2

ORDER BY ROWNUM ASC

)

WHERE RECNO = 2

结果为:

ID NAME

05 fifth

4.抽出按某种方式排序的记录集中的第M条记录开始的X条记录

3里所讲得仅仅是抽取一条记录的情况,当我们需要抽取多条记录的时候,此时在2中的N的取值应该是在N >= (M + X - 1)这个范围内,当让最经济的取值就是取等好的时候了的时候了。当然最后的抽取条件也不是RECNO = N了,应该是RECNO BETWEEN M AND (M + X - 1)了,所以随之而来的SQL语句则为:

SELECT 列名1...列名n FROM

(

SELECT ROWNUM RECNO, 列名1...列名nFROM

(

SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)

WHERE ROWNUM <= N (N >= (M + X - 1))

ORDER BY ROWNUM ASC

)

WHERE RECNO BETWEEN M AND (M + X - 1)

同样以上面的数据为例,则抽取NAME的字母顺的第2条记录开始的3条记录的SQL语句为:

SELECT ID, NAME FROM

(

SELECT ROWNUM RECNO, ID, NAME FROM

(SELECT * FROM CUSTOMER ORDER BY NAME)

WHERE ROWNUM <= (2 + 3 - 1)

ORDER BY ROWNUM ASC

)

WHERE RECNO BETWEEN 2 AND (2 + 3 - 1)

结果如下:

ID NAME

05 fifth

01 first

04 forth

以此为基础,再扩展的话,做成存储过程,将开始记录数以及抽取记录数为参数,就可以轻松实现分页抽取数据。

Oracle中的limit问题解决方案
2009-05-12 17:19

从mysql到oracle迁移一个程序,遇到了sql语句中的limit问题。
查遍网络,所提供的方法都极其麻烦,不利于通用。
以下是我的解决方案,可以与limit媲美。

比如从一个mobileuser 用户表中查询2到6条记录,按照第一次使用时间排序。

mysql语句为:

SELECT userid,password,firstusetime from mobileuser ORDER BY firstusetime DESC limit 2,6;

oracle语句为:

SELECT * FROM ( SELECT userid,password,firstusetime, RANK() OVER (ORDER BY firstusetime DESC ) RN FROM mobileuser ) WHERE RN between 2 and 6;


rank() over 函数代表排行依据,整个sql语句就是从根据“ORDER BY firstusetime DESC”这个标准,找到排行2到6位的数据。

但是存在一个问题,根据排行依据,有些数据是并列的,这样返回的数据条数就会多于我们期望的。这时我们加一个rownum限制就行了。

SELECT * FROM ( SELECT userid,password,firstusetime, RANK() OVER (ORDER BY firstusetime DESC ) RN FROM mobileuser ) WHERE RN between 2 and 6 and rownum<=5;
分享到:
评论

相关推荐

    sqlserver中访问ORACLE返回1行数据

    通过对 ODBC 驱动程序的检查、查询语句的修正以及对 Oracle 数据源的审查,大多数情况下都能够找到合适的解决方案。此外,良好的编程习惯和充分的测试也是避免此类问题的关键。通过上述步骤,可以有效地解决跨数据库...

    Oracle数据库日常维护手册.pdf

    - **操作**:通常可以通过查看操作系统的日志文件(如Linux下的`/var/log/messages`)来监控Oracle数据库运行过程中可能遇到的问题。 - 需要定期检查这些日志文件,寻找与Oracle相关的错误或警告信息。 - 特别注意...

    Oracle SQL语句分页问题

    在Oracle中实现分页主要依赖于`ROWNUM`伪列和`LIMIT`/`OFFSET`子句等方法。 ##### 2.2 使用ROWNUM进行分页 在早期版本的Oracle中,最常用的分页方式是通过`ROWNUM`来实现: - **ROWNUM**:这是一个特殊的列,用于...

    Oracle Database 12c For RHEL7安装配置手册-1.00

    4. **Easy Top-N and Pagination Queries**:提供了更简单的方法来实现Top-N查询和分页查询。 5. **Row Pattern Matching**:增强了行模式匹配功能,便于复杂的数据匹配操作。 6. **Partitioning Improvements**:...

    Oracle应用产品常见问题探析.pptx

    另外,错误信息也可以在Metalink(Oracle的技术支持数据库)上寻找解决方案。 2. **标准管理器进程数**:标准管理器的进程数设置直接影响MRP(Material Requirements Planning)后台进程的运行。建议的计算公式是...

    Oracle12c新特性再总结

    - Flex ASM:Oracle 12c的Flex ASM旨在解决ASM实例的单点故障问题。它允许在一个集群中只运行少数ASM实例,当某个实例故障时,系统能自动在其他节点上启动替代实例,确保高可用性和负载均衡。要启用Flex ASM,可以...

    SQL中分页解决方案

    ### SQL中的分页解决方案 在数据库管理中,分页是一种常用的技术手段,它能有效地处理大量数据的查询结果,提高用户体验。本篇文章将详细介绍在三种主流数据库系统:Oracle、SQL Server 和 MySQL 中如何实现分页...

    如何避免JDBC引起的内存溢出情况

    #### 二、针对不同数据库的解决方案 **1. MySQL** 对于MySQL,可以通过修改JDBC连接字符串中的参数来控制结果集的读取方式。具体来说,可以在连接字符串中添加`useCursorFetch=true`和`defaultFetchSize=100`两个...

    mybatis问题总结.docx

    首先,针对"Mybatis问题总结",我们关注的是MyBatis框架在实际开发中可能遇到的错误和解决方案。MyBatis是一个轻量级的持久层框架,它简化了Java开发者与数据库之间的交互,通过XML或注解方式来配置SQL语句。 1. ...

    oracle,mysql,SqlServer三种数据库的分页查询的实例

    至于SQL Server,它提供了多种分页解决方案。一种是利用`NOT IN`和`SELECT TOP`: ```sql SELECT TOP 10 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 20 id FROM TestTable ORDER BY id)) ORDER BY ID; SELECT...

    关于SQL Server SQL语句查询分页数据的解决方案

    关于SQL Server SQL语句查询分页数据的解决方案 在日常工作中,我们经常需要处理大量数据,并从中获取特定页面的数据。特别是在Web应用开发中,为了提高用户体验,通常会将数据进行分页显示。针对这一需求,本文将...

    sql 分页查询资料

    由于`OFFSET`的性能问题(尤其是当偏移量增大时),可以考虑使用其他策略,如“书签分页”(使用用户上次访问的最后一个项目的ID作为下一次查询的起点)或“窗口函数”(如RANK()、ROW_NUMBER()和DENSE_RANK()),...

    Oracle性能调整建议手册

    - **作用**:监控锁定情况,及时发现并解决死锁等问题。 **4.2 找到热数据块** - **命令**:`SELECT * FROM v$bh WHERE GETS &gt; 10000;` - **作用**:定位频繁访问的数据块,考虑增加缓存或调整访问策略。 **4.3 ...

    面试常问问题.doc

    4. **问题解决策略**:展示你的思考过程,包括分析问题、查找资源、实验验证和实施解决方案等步骤。强调你的学习能力和解决问题的能力。 5. **出差和加班态度**:显示你的团队精神和工作适应性,表明你愿意为了工作...

    3种数据库分页技术.pdf

    数据库分页技术是数据库管理系统中用于...而在SQL Server和Oracle中,使用窗口函数如 `ROW_NUMBER()` 或 `RANK()` 可以提供更高效、灵活的解决方案。无论哪种技术,理解和优化分页策略都是提高数据库性能的关键部分。

    SQL练习题.pdf

    下面是对每个问题的详细解释和解决方案: 问题 1 写出一条 SQL 语句:取出表 A 中第 31 到第 40 记录 解决方案: * MySQL:`select * from A limit 30, 10` * MS-SQL Server: + 解法 1:`select top 10 * from ...

    Generic_SQL_Query

    为了实现一个通用的解决方案,我们可以使用窗口函数`ROW_NUMBER()`。以下是一个示例查询,它已经在Oracle、DB2和Microsoft SQL Server 2005上进行了测试,并能在这三个数据库中正常工作: ```sql SELECT PKEY, ...

    类似淘宝 百度 谷歌的通用分页

    首先,通用分页意味着该分页解决方案可以适用于多种数据库系统,例如Oracle、MSSQL2000和MySQL。Oracle是企业级的关系型数据库管理系统,广泛应用于大型企业和互联网公司;MSSQL2000是微软早期推出的SQL Server版本...

    存储过程分页和ASP.NET后台代码

    5. **TOP-N语法**:在某些数据库系统中,如Oracle,可以使用TOP或ROWNUM配合子查询来实现分页。 6. **游标(Cursor)**:虽然不推荐在分页查询中使用游标,但在某些特定情况下,例如处理复杂逻辑,游标可能是一个...

Global site tag (gtag.js) - Google Analytics