oracle top n(源:http://huibin.iteye.com/blog/419780)
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数据库中,由于不直接支持SQL Server中的`SELECT TOP N`语法,用户通常需要采用其他方式来实现相同的功能,即获取数据集的前N条记录。以下将详细讲解如何在Oracle中实现这一操作。 1. 基本的SELECT TOP N...
在Oracle数据库中,"Top N"问题通常指的是查询数据集中最大的N个记录,这在报表、数据分析或数据展示等场景中非常常见。由于Oracle数据库不直接支持像SQL Server中的`TOP`子句来实现这个功能,因此需要采用一些特定...
A、获取top前10个Oracle的进程,并打印出(根据实际进程情况列出 R/S 状态) B、对这些进行进行PS检查资源占有情况,并确定是那个数据库实例的进程 C、根据当前目录下的connect.json配置数据库连接数据库访问,打印...
在Oracle数据库中,由于不直接支持SQL Server中的`SELECT TOP N`语法,我们需要采用其他方法来获取表中的前N条记录。以下是如何在Oracle中实现类似功能的详细步骤。 1. **基本方法:使用ROWNUM和ORDER BY** Oracle...
### 在Oracle中实现SELECT TOP N的方法 #### 一、引言 在数据库查询操作中,经常需要获取数据表中的前N条记录,这种需求在多种业务场景中都非常常见。Oracle数据库作为一款强大的关系型数据库管理系统,提供了多种...
在Oracle数据库中,标准SQL语法并不直接支持类似于`SELECT TOP 100 * FROM table_a`这样的语句来直接获取表中的前N行数据。然而,在实际业务场景中,这种需求却十分常见。例如,我们可能需要获取最近的100次登录记录...
在Oracle数据库中,由于不直接支持SQL Server中的`SELECT TOP N`语法,用户通常需要采用其他方式来实现相同的功能。本文将详细介绍如何在Oracle中实现类似`SELECT TOP N`的查询,以及如何根据需求进一步调整查询以...
sql语句中select top n与oracle的rownum与mysql的limit 取前几条数据sql简单用法
@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 ``` #### 四、注意事项 - 在安装...
Top N查询是指从结果集中选择排名前N的记录,而Bottom N则是选择最后N个记录。在Oracle中,我们可以使用`RANK()`, `DENSE_RANK()`, 或 `ROW_NUMBER()` 函数配合`ORDER BY`子句来实现。例如,如果我们想找到每个区域...
3 Oracle开发专题之:分析函数3 Top Bottom N First Last NTile 4 Oracle开发专题之:窗口函数 5 Oracle开发专题之:报表函数 6 Oracle开发专题之:分析函数总结 7 Oracle开发专题之:26个分析函数 8 分析函数...
在Oracle中,我们可以使用RowNum函数、Minus运算符、Subquery和Top-N查询来实现分页查询。这些方法可以根据不同的需求选择合适的方法来实现分页查询。在开发中,我们需要根据实际情况选择合适的方法来实现分页查询。
【Unix和Oracle知识点详解】 Unix操作系统是广泛应用于服务器和大型计算环境的一种多用户、多任务的操作系统,尤其在数据库管理领域,如Oracle数据库的运行环境中,Unix提供了强大的系统管理和性能优化工具。以下将...
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...
- **TOP子句**:SQL Server中的`TOP`子句在Oracle中可以使用`WHERE ROWNUM <= N`替代。 - **GUID生成**:SQL Server中的`NEWID()`函数在Oracle中可以通过自定义函数实现,例如文档中提供的`NEWID`函数示例。 #### ...
- 选择前n行记录:SQL Server的`SELECT TOP n *`在Oracle中用`SELECT * FROM table WHERE ROWNUM < n+1`实现。 - JOIN操作:在Oracle中,`JOIN`操作通常写为`FROM table1, table2 WHERE table1.column = table2....
- Sql server使用`TOP`,如`SELECT TOP n * FROM table_name`。 - 查看表的结构: - Oracle可以使用`DESC table_name`或查询`user_tab_columns`数据字典表。 - Sql server没有内置的DESC命令,但可以查询`...
例如,可以使用`ROWNUM`来选择结果集中的前N行,或者在结合子查询和外部查询的情况下实现TOP N查询。 此外,文档中还涉及了一些错误的查询语句,可能是由于OCR扫描错误导致的。比如`selectrownum,id,age,...