`
lgworld
  • 浏览: 15849 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

oracle top N

阅读更多

oracle top n(源:http://huibin.iteye.com/blog/419780)

1.ORACLE中实现SELECT TOP N
  
由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BYROWNUM的组合来实现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纪录中抽出第MM <= N)条记录


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


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


      SELECT
列名1...列名n
FROM

         (

         SELECT ROWNUM RECNO,
列名1...列名n
FROM

           (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...列名n
FROM

            (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...列名n
FROM

          (

          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 N的方法

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

    Oracle 的top问题

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

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

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

    如何在Oracle中实现SELECT_TOP_N的方法

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

    在ORACLE中实现SELECT TOP N的方法

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

    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简单用法

    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开发之分析函数(Top/Bottom N、First/Last、NTile)

    Top N查询是指从结果集中选择排名前N的记录,而Bottom N则是选择最后N个记录。在Oracle中,我们可以使用`RANK()`, `DENSE_RANK()`, 或 `ROW_NUMBER()` 函数配合`ORDER BY`子句来实现。例如,如果我们想找到每个区域...

    oracle 分析函数详解(有例子)

    3 Oracle开发专题之:分析函数3 Top Bottom N First Last NTile 4 Oracle开发专题之:窗口函数 5 Oracle开发专题之:报表函数 6 Oracle开发专题之:分析函数总结 7 Oracle开发专题之:26个分析函数 8 分析函数...

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

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

    unix 和oracle的题目

    【Unix和Oracle知识点详解】 Unix操作系统是广泛应用于服务器和大型计算环境的一种多用户、多任务的操作系统,尤其在数据库管理领域,如Oracle数据库的运行环境中,Unix提供了强大的系统管理和性能优化工具。以下将...

    oracle到sqlserver存储过程语法转换

    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.function_name') AND type in (N'FN', N'IF', N'TF')) DROP FUNCTION dbo.function_name; GO CREATE FUNCTION dbo.function_name (@p...

    SqlServer转换Oracle.docx

    - **TOP子句**:SQL Server中的`TOP`子句在Oracle中可以使用`WHERE ROWNUM &lt;= N`替代。 - **GUID生成**:SQL Server中的`NEWID()`函数在Oracle中可以通过自定义函数实现,例如文档中提供的`NEWID`函数示例。 #### ...

    从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....

    SqlServer与Oracle差异

    - Sql server使用`TOP`,如`SELECT TOP n * FROM table_name`。 - 查看表的结构: - Oracle可以使用`DESC table_name`或查询`user_tab_columns`数据字典表。 - Sql server没有内置的DESC命令,但可以查询`...

    oracle高级应用基础.pdf

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

Global site tag (gtag.js) - Google Analytics