`
xu520
  • 浏览: 81705 次
  • 性别: Icon_minigender_1
  • 来自: 金华
社区版块
存档分类
最新评论

在ORACLE中实现SELECT 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

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

当然了,上面所讲的都是一些最基本的,实际应用中往往都没有这么简单,但是不管怎么说,不管复杂的应用总是由这些简单的元素构成,掌握一些最基本的方法始终是重要的。

实际上网上这样的文章比较多,我也只是稍微梳理了一下条理而写的这篇文章。希望能给初学者一些帮助。

附加例子(下面两个结果相同):

select * from (select * from system.jd_jdxx where DWBH='10001' and JDZBH='JDZXX000205' order by BH ) where rownum<=3 order by rownum desc

select * from (select * from system.jd_jdxx where DWBH='10001' and JDZBH='JDZXX000205' order by BH asc) where rownum<=3 order by rownum


分享到:
评论

相关推荐

    如何在Oracle中实现SELECT_TOP_N的方法

    在Oracle数据库中,由于不直接支持SQL Server中的`SELECT TOP N`语法,我们需要采用其他方法来获取表中的前N条记录。以下是如何在Oracle中实现类似功能的详细步骤。 1. **基本方法:使用ROWNUM和ORDER BY** Oracle...

    如何在Oracle中实现SELECT TOP N的方法

    在Oracle数据库中,由于不直接支持SQL Server中的`SELECT TOP N`语法,用户通常需要采用其他方式来实现相同的功能,即获取数据集的前N条记录。以下将详细讲解如何在Oracle中实现这一操作。 1. 基本的SELECT TOP N...

    oracle select top的方法

    在Oracle数据库中,标准SQL语法并不直接支持类似于`SELECT TOP 100 * FROM table_a`这样的语句来直接获取表中的前N行数据。然而,在实际业务场景中,这种需求却十分常见。例如,我们可能需要获取最近的100次登录记录...

    在ORACLE中SELECT TOP N的实现方法

    在Oracle数据库中,由于不直接支持SQL Server中的`SELECT TOP N`语法,用户通常需要采用其他方式来实现相同的功能。本文将详细介绍如何在Oracle中实现类似`SELECT TOP N`的查询,以及如何根据需求进一步调整查询以...

    sql语句中select top n与oracle的rownum与mysql的limit用法

    sql语句中select top n与oracle的rownum与mysql的limit 取前几条数据sql简单用法

    Oracle 的top问题

    在Oracle数据库中,"Top N"问题通常指的是查询数据集中最大的N个记录,这在报表、数据分析或数据展示等场景中非常常见。由于Oracle数据库不直接支持像SQL Server中的`TOP`子句来实现这个功能,因此需要采用一些特定...

    Oracle中实现MySql中limit+SqlServer分页+分页的存储过程

    接下来,我们讨论在Oracle中实现分页的方法。Oracle不直接支持`LIMIT`和`OFFSET`,但它可以通过`ROWNUM`伪列来实现分页。以下是一些常见的方式: 1. **NOT IN子查询**: ```sql SELECT * FROM a_matrix_...

    获取top前10个Oracle的进程(支持多实例)

    A、获取top前10个Oracle的进程,并打印出(根据实际进程情况列出 R/S 状态) B、对这些进行进行PS检查资源占有情况,并确定是那个数据库实例的进程 C、根据当前目录下的connect.json配置数据库连接数据库访问,打印...

    java笔记\Oracle里sql不能用limit的处理

    在Oracle中,我们可以使用RowNum函数、Minus运算符、Subquery和Top-N查询来实现分页查询。这些方法可以根据不同的需求选择合适的方法来实现分页查询。在开发中,我们需要根据实际情况选择合适的方法来实现分页查询。

    从Sql Server迁移到 Oracle 过程中代码需要调整的地方

    - 选择前n行记录:SQL Server的`SELECT TOP n *`在Oracle中用`SELECT * FROM table WHERE ROWNUM &lt; n+1`实现。 - JOIN操作:在Oracle中,`JOIN`操作通常写为`FROM table1, table2 WHERE table1.column = table2....

    Oracle与SQL的分页实现

    本文将深入探讨Oracle与通用SQL在实现分页查询时的不同方法,以及它们各自的优缺点。 ### Oracle的分页实现 在Oracle数据库中,分页查询主要依赖于ROWNUM伪列和MINUS操作符。ROWNUM用于返回行号,而MINUS则用于从...

    mysql使用GROUP BY分组实现取前N条记录的方法

    GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法。 这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~): 结果: 方法一: 代码如下:SELECT a.id,a.SName,a.ClsNo...

    vcenter6.0采用oracle11g独立数据库

    本指南详细介绍了如何在vCenter 6.0中使用Oracle 11g作为独立数据库的方法。通过创建专门的表空间和用户,并执行一系列脚本来初始化数据库模式,可以为vCenter提供一个稳定可靠的后端数据库。在整个过程中,需要注意...

    oracle mysql sqlserver分页

    本文将详细介绍Oracle、MySQL以及SQL Server三种主流数据库系统中的分页技术,包括它们各自的实现方法和一些实用技巧。 ### 一、Oracle 分页 Oracle数据库提供了强大的功能来支持分页查询。在Oracle中,主要使用`...

    oracle、mysql数据库分页参照.pdf

    数据库分页是数据库管理系统中一个常见的功能,用于在大量数据中高效地检索并展示一部分结果,通常用于网页或应用的滚动加载。以下是针对Oracle、MySQL、SQL Server和DB2这四种常见数据库系统的分页实现方案的详细...

    oracle高级应用基础.pdf

    例如,可以使用`ROWNUM`来选择结果集中的前N行,或者在结合子查询和外部查询的情况下实现TOP N查询。 此外,文档中还涉及了一些错误的查询语句,可能是由于OCR扫描错误导致的。比如`selectrownum,id,age,...

    mysql,mssql,oracle分页精典代码集锦

    在 MySQL 中实现分页查询通常有两种方法:`LIMIT` 和 `NOT IN` 方法。 1. **LIMIT 方法**: ```sql SELECT * FROM book LIMIT M, N; ``` - **解释**:此语句从第 M+1 行开始返回 N 条记录。 - **示例**:假设...

    SQL_Server,Oracle,DB2数据库SQL语句比较

    在Oracle中,通过`SELECT * FROM xtable WHERE ROWNUM &lt;= N`实现相同功能。注意,ROWNUM是Oracle的一个伪列,用于标记每一行的序号。 DB2则使用`SELECT * FROM xtable FETCH FIRST N ROWS ONLY`来获取前N行数据。`...

Global site tag (gtag.js) - Google Analytics