Oracle数据库实现获取前几条数据的方法

如何在Oracle数据库中实现获取前几条数据的方法呢?就是类似SQL语句中的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...列名nFROM
 (
 SELECT ROWNUM RECNO, 列名1...列名nFROM
(SELECT 列名1...列名nFROM 表名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的时候,即为我们的标题第三点所讲的结果。实际上,第二点的做法在里面N>M的部分的数据是基本上不会用到的,我们仅仅是为了说明方便而采用。
如上所述,则SQL语句应为:

SELECT 列名1...列名nFROM
 (
SELECT ROWNUM RECNO, 列名1...列名nFROM
(SELECT 列名1...列名nFROM 表名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条记录:
上一点所讲的仅仅是抽取一条记录的情况,当我们需要抽取多条记录的时候,此时在第二点中的N的取值应该是在N >= (M + X -
1)这个范围内,当然最经济的取值就是取等号的时候了。当然最后的抽取条件也不是RECNO = N了,应该是RECNO BETWEEN M AND
(M + X - 1)了,所以随之而来的SQL语句则为:
 
SELECT 列名1...列名nFROM
(
 SELECT ROWNUM RECNO, 列名1...列名nFROM
(
SELECT 列名1...列名nFROM 表名ORDER BY 列名1...列名n)
WHERE ROWNUM <= N (N >= (M + X - 1))
ORDER BY ROWNUM ASC
)
 WHERE RECNO BETWEEN M AND (M + X - 1)
 
同样以上面的数据为例,则抽取NAME的字母顺的第二条记录开始的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
 
以此为基础,再扩展的话,做成存储过程,将开始记录数以及抽取记录数为参数,就可以轻松实现分页抽取数据。

时间: 2024-08-19 01:32:02

Oracle数据库实现获取前几条数据的方法的相关文章

Oracle查询前几条数据的方法

在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)where rownum <=N(抽出记录数)order by rownum asc 如:select id,name from (selec

关于sql server远程访问Oracle数据库 OpenQuery查询返回多条数据的问题

在Sql Server远程访问Oracle 中的数据库表时: 远程语法通常为: select * from OpenQuery(Oracle链接服务器名称,‘查询语句’) eg: select * from OPENQUERY(QTX,'select * from student') 有些情况下只会返回student表一条数据 第一条 解决方法:数据源ODBC中 选择系统DNS 时,新建系统数据源 选择的对应驱动应该为Oracle Instant Client Dricver  这个驱动需要安装

mysql或者oracle分组排序取前几条数据

mysql: select a.* from(select t1.*,(select count(*)+1 from 表 where 分组字段=t1.分组字段 and 排序字段<t1.排序字段) as group_idfrom 表 t1) awhere a.group_id<=3 Oracle: SELECT t.*            FROM (SELECT ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段 DESC) rn,      

oracle取分组的前N条数据

select * from(select animal,age,id, row_number()over(partition by animal order by age desc) row_num from zoo) where row_num <=5; http://bbs.csdn.net/topics/350001717

Linq排序,获取前5条数据

_dic = _dic.OrderByDescending(x => x.Value).ToDictionary(x=>x.Key,x=>x.Value); var Num = _dic.ToList().Take(5).Select(a => a.Key.ToString()).ToArray(); var Str = string.Join(",", Num);  

Oracle数据库truncate table后恢复原来数据的方法,留着万一用得到呢

概述:北京某国企客户 Oracle 11g R2 数据库误truncate table CM_CHECK_ITEM_HIS,表数据丢失,业务查询到该表时报错,此时发现数据库的备份不能用,表数据无法查询. 客户Oracle 11g R2 数据库误truncate table CM_CHECK_ITEM_HIS,表数据丢失,业务查询到该表时报错,此时发现数据库的备份不能用,表数据无法查询.Truncate数据的机理是,ORACLE会在数据字典和Segment?Header中更新表的Data?Obje

MySQL 分组后取每组前N条数据

与oracle的 rownumber() over(partition by xxx  order by xxx )语句类似,即:对表分组后排序 创建测试emp表 DROP TABLE IF EXISTS emp; CREATE TABLE emp ( empno decimal(4,0) NOT NULL, ename varchar(10) DEFAULT NULL, job varchar(9) DEFAULT NULL, mgr decimal(4,0) DEFAULT NULL, hi

查询前几条数据

SQL查询前10条的方法为: 1.select top X *  from table_name --查询前X条记录,可以改成需要的数字,比如前10条. 2.select top X *  from table_name order by colum_name desc --按colum_name属性降序排序查询前X条记录,“order by” 后紧跟要排序的属性列名,其中desc表示降序,asc表示升序(默认也是升序方式). 3.select top n * from (select top 

oracle中取前几条数据&amp;TRUNC()函数

在oracle中查表中的前10条数据---- select * from test where rownum <= 10 ;  rownum是把SQL出来的结果进行编号,始终从1开始,常见的用途就是用来分页.类似于MYSQL和SQL SERVER的top. select * from (select a.*,rownum rn from test a) where rn >=10 and rn<=20; 输出10到20条语句.因为rownum本身只能用<=的比较方式,只有转成实例才