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;
|
分享到:
相关推荐
通过对 ODBC 驱动程序的检查、查询语句的修正以及对 Oracle 数据源的审查,大多数情况下都能够找到合适的解决方案。此外,良好的编程习惯和充分的测试也是避免此类问题的关键。通过上述步骤,可以有效地解决跨数据库...
- **操作**:通常可以通过查看操作系统的日志文件(如Linux下的`/var/log/messages`)来监控Oracle数据库运行过程中可能遇到的问题。 - 需要定期检查这些日志文件,寻找与Oracle相关的错误或警告信息。 - 特别注意...
在Oracle中实现分页主要依赖于`ROWNUM`伪列和`LIMIT`/`OFFSET`子句等方法。 ##### 2.2 使用ROWNUM进行分页 在早期版本的Oracle中,最常用的分页方式是通过`ROWNUM`来实现: - **ROWNUM**:这是一个特殊的列,用于...
4. **Easy Top-N and Pagination Queries**:提供了更简单的方法来实现Top-N查询和分页查询。 5. **Row Pattern Matching**:增强了行模式匹配功能,便于复杂的数据匹配操作。 6. **Partitioning Improvements**:...
另外,错误信息也可以在Metalink(Oracle的技术支持数据库)上寻找解决方案。 2. **标准管理器进程数**:标准管理器的进程数设置直接影响MRP(Material Requirements Planning)后台进程的运行。建议的计算公式是...
- Flex ASM:Oracle 12c的Flex ASM旨在解决ASM实例的单点故障问题。它允许在一个集群中只运行少数ASM实例,当某个实例故障时,系统能自动在其他节点上启动替代实例,确保高可用性和负载均衡。要启用Flex ASM,可以...
### SQL中的分页解决方案 在数据库管理中,分页是一种常用的技术手段,它能有效地处理大量数据的查询结果,提高用户体验。本篇文章将详细介绍在三种主流数据库系统:Oracle、SQL Server 和 MySQL 中如何实现分页...
#### 二、针对不同数据库的解决方案 **1. MySQL** 对于MySQL,可以通过修改JDBC连接字符串中的参数来控制结果集的读取方式。具体来说,可以在连接字符串中添加`useCursorFetch=true`和`defaultFetchSize=100`两个...
首先,针对"Mybatis问题总结",我们关注的是MyBatis框架在实际开发中可能遇到的错误和解决方案。MyBatis是一个轻量级的持久层框架,它简化了Java开发者与数据库之间的交互,通过XML或注解方式来配置SQL语句。 1. ...
至于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语句查询分页数据的解决方案 在日常工作中,我们经常需要处理大量数据,并从中获取特定页面的数据。特别是在Web应用开发中,为了提高用户体验,通常会将数据进行分页显示。针对这一需求,本文将...
由于`OFFSET`的性能问题(尤其是当偏移量增大时),可以考虑使用其他策略,如“书签分页”(使用用户上次访问的最后一个项目的ID作为下一次查询的起点)或“窗口函数”(如RANK()、ROW_NUMBER()和DENSE_RANK()),...
- **作用**:监控锁定情况,及时发现并解决死锁等问题。 **4.2 找到热数据块** - **命令**:`SELECT * FROM v$bh WHERE GETS > 10000;` - **作用**:定位频繁访问的数据块,考虑增加缓存或调整访问策略。 **4.3 ...
4. **问题解决策略**:展示你的思考过程,包括分析问题、查找资源、实验验证和实施解决方案等步骤。强调你的学习能力和解决问题的能力。 5. **出差和加班态度**:显示你的团队精神和工作适应性,表明你愿意为了工作...
数据库分页技术是数据库管理系统中用于...而在SQL Server和Oracle中,使用窗口函数如 `ROW_NUMBER()` 或 `RANK()` 可以提供更高效、灵活的解决方案。无论哪种技术,理解和优化分页策略都是提高数据库性能的关键部分。
下面是对每个问题的详细解释和解决方案: 问题 1 写出一条 SQL 语句:取出表 A 中第 31 到第 40 记录 解决方案: * MySQL:`select * from A limit 30, 10` * MS-SQL Server: + 解法 1:`select top 10 * from ...
为了实现一个通用的解决方案,我们可以使用窗口函数`ROW_NUMBER()`。以下是一个示例查询,它已经在Oracle、DB2和Microsoft SQL Server 2005上进行了测试,并能在这三个数据库中正常工作: ```sql SELECT PKEY, ...
首先,通用分页意味着该分页解决方案可以适用于多种数据库系统,例如Oracle、MSSQL2000和MySQL。Oracle是企业级的关系型数据库管理系统,广泛应用于大型企业和互联网公司;MSSQL2000是微软早期推出的SQL Server版本...
5. **TOP-N语法**:在某些数据库系统中,如Oracle,可以使用TOP或ROWNUM配合子查询来实现分页。 6. **游标(Cursor)**:虽然不推荐在分页查询中使用游标,但在某些特定情况下,例如处理复杂逻辑,游标可能是一个...