如何在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
 
以此为基础,再扩展的话,做成存储过程,将开始记录数以及抽取记录数为参数,就可以轻松实现分页抽取数据。

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

  1. 不同数据库,查询前n条数据的SQL语句

    不同的数据库,支持的SQL语法略有不同,以下是不同数据库查询前n条数据的SQl语句 SQL Server(MSSQL) SELECT TOP n * FROM table_name ORACLE SE ...

  2. Oracle查询前几条数据的方法

    在Oracle中实现select top N:由于Oracle不支持select top 语句,所以在Oracle中经常是用order by 跟rownum的组合来实现select top n的查询. ...

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

    在Sql Server远程访问Oracle 中的数据库表时: 远程语法通常为: select * from OpenQuery(Oracle链接服务器名称,‘查询语句’) eg: select * f ...

  4. Linq排序,获取前5条数据

    _dic = _dic.OrderByDescending(x => x.Value).ToDictionary(x=>x.Key,x=>x.Value); var Num = _d ...

  5. oracle取分组的前N条数据

    select * from(select animal,age,id, row_number()over(partition by animal order by age desc) row_num ...

  6. oracle数据库只查询前n条

    select * from  (select * from   tablename order by createdate desc)  aaa -- 按创建时间倒排序 where rownum &l ...

  7. Oracle 获取前几行数据问题的陷阱

    查询用户数据表,需要根据时间正序排序,然后获取时间最早的前三条数据,是不是第一印象想这么写: select * from users where rownum<4 order by datati ...

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

    与oracle的 rownumber() over(partition by xxx  order by xxx )语句类似,即:对表分组后排序 创建测试emp表 1 2 3 4 5 6 7 8 9 ...

  9. 各个数据库中,查询前n条记录的方法

    SQL查询前10条的方法为: 1.select top X *  from table_name --查询前X条记录,可以改成需要的数字,比如前10条. 2.select top X *  from  ...

随机推荐

  1. The Cave

    The Cave 题目描述 给定一棵有n个节点的树,相邻两点之间的距离为1. 请找到一个点x,使其满足所有m条限制,其中第i条限制为dist(x,a[i])+dist(x,b[i])<=d[i] ...

  2. Codeforces Round #324 (Div. 2) A

    A. Olesya and Rodion time limit per test 1 second memory limit per test 256 megabytes input standard ...

  3. git bash 如何进入某个盘的特定文件夹

    下面是用gitbash进入E:\the fifth version of ecard\epayment这个文件夹下 命令如下图所示:

  4. LinuxMint下JDK+Tomcat+Mysql+Eclipse javaEE安装

    网上查了很多方法,总结下比较简单的做法. 本人使用的系统版本为64位LinuxMint18,cinnamon桌面环境,预装Openjdk1.8.开发使用版本为oracle的1.7版本jdk. 1 jd ...

  5. pip切换国内的源

    pip install Flask -i http://pypi.douban.com/simple ~/.pip/pip.conf The documentation says the config ...

  6. Instruments Tutorial for iOS: How To Debug Memory Leaks

    http://www.raywenderlich.com/2696/instruments-tutorial-for-ios-how-to-debug-memory-leaks Update 4/12 ...

  7. 和菜鸟一起学c之gcc编译过程及其常用编译选项【转】

    转自:http://blog.csdn.net/eastmoon502136/article/details/8162626 版权声明:本文为博主东月之神原创文章,未经博主允许不得转载. 上篇文章,知 ...

  8. LVM更换硬盘

    #检测坏道 smartctl -a /dev/sdd #硬盘检测 e2fsck -f /dev/mapper/vg_root-lv_data #重新定义空间大小,将原来的大小上减去要移走的硬盘 res ...

  9. Oracle sql例子

    create database oracle1 )) select * from class ,'一班') ,'二班') ,'三班') --创建学生表 ),cid int ,constraint FK ...

  10. Python学习杂记_14_模块(二)_常用模块

    常用模块 random 模块 import random print(random.random()) # 随机浮点数,默认取0-1,不能指定范围 print(random.randint(1, 20 ...