`

SELECT TOP ORACLE

阅读更多


http://www.cnblogs.com/cxd4321/archive/2008/03/20/1114377.html



在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

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

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

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

相关推荐

    oracle select top的方法

    ### Oracle Select Top 的方法 #### 一、问题背景与需求分析 在Oracle数据库中,标准SQL语法并不直接支持类似于`SELECT TOP 100 * FROM table_a`这样的语句来直接获取表中的前N行数据。然而,在实际业务场景中,...

    在ORACLE中实现SELECT TOP N的方法

    ### 在Oracle中实现SELECT TOP N的方法 #### 一、引言 在数据库查询操作中,经常需要获取数据表中的前N条记录,这种需求在多种业务场景中都非常常见。Oracle数据库作为一款强大的关系型数据库管理系统,提供了多种...

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

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

    如何在Oracle中实现SELECT_TOP_N的方法

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

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

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

    七种数据库中Select Top的用法

    本文将详细介绍七种常见数据库系统(包括 Oracle、SQL Server、MySQL 等)中 Select Top 的具体用法,并通过示例帮助读者更好地理解这些概念。 #### 一、Oracle 数据库中的 ROWNUM 用法 在 Oracle 数据库中,`...

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

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

    在ORACLE中SELECT TOP N的实现方法

    在Oracle数据库中,由于不支持SQL Server中的`SELECT TOP N`语法,我们需要使用其他方法来实现类似的功能。这里主要介绍两种常见的实现方式,以及如何在这些基础上抽取特定位置的记录。 1. **基本的`SELECT TOP N`...

    Oracle 的top问题

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

    Oracle向MS SQL Server移植中select top问题的研究.pdf

    Oracle向MS SQL Server移植中select top问题的研究.pdf

    SQL SELECT TOP, LIMIT, ROWNUM 子句

    SQL SELECT TOP, LIMIT, ROWNUM 子句 SQL SELECT TOP 子句 SELECT TOP 子句用于规定要返回的记录的数目。 SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的。 注意:并非所有的数据库系统都支持 ...

    ORACLE与SQLSERVER中的语法区别

    在 ORACLE 中,SELECT 语句使用 `ROWNUM` 伪列来限制返回的记录数,而在 SQL Server 中,使用 `TOP` 语句。例如: SQL Server: `SELECT TOP 1 * FROM tablename` ORACLE: `SELECT * FROM tablename WHERE ROWNUM ...

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

    WHERE ID &gt; (SELECT MAX(id) FROM (SELECT TOP (每页大小 * (待查询页数 - 1)) id FROM TestTable ORDER BY id) AS T) ORDER BY ID ``` 3. MySQL数据库: MySQL支持非常直观的`LIMIT`子句进行分页: ```sql -- 第n...

    Oracle数据库巡检报告

    - **2.1.4 检查Oracle的实例状态**:使用`select * from v$instance;`查询Oracle实例的状态,确认实例是否处于OPEN状态。 - **2.1.5 检查数据库读写状态**:检查数据库是否可以正常进行读写操作,可以通过查询`v$...

    Oracle中的分析函数详解

    Oracle数据库系统是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据主导地位。其中,Oracle的分析函数是其强大的特性之一,它允许用户在单个SQL查询中执行复杂的分析操作,而无需使用子查询或者自...

    vcenter6.0采用oracle11g独立数据库

    @D:\dbschema\calc_topn3_proc_oracle.sql @D:\dbschema\calc_topn4_proc_oracle.sql @D:\dbschema\clear_topn1_proc_oracle.sql @D:\dbschema\clear_topn2_proc_oracle.sql ``` #### 四、注意事项 - 在安装...

    oracle、mysql数据库分页.pdf

    select top @pagesize*(@page-1) id from tablename order by id ) order by id; -- 方案二 select top @pagesize * from tablename where id &gt; ( select max(id) from ( select top (@page-1)*@...

    oracle系统性能监控 及 top10问题.txt

    ### Oracle系统性能监控及Top10问题解析 #### 一、引言 Oracle数据库作为业界广泛使用的数据库管理系统之一,其性能稳定性和效率对于业务系统的正常运行至关重要。在Oracle数据库的日常管理和维护过程中,经常会...

Global site tag (gtag.js) - Google Analytics