我是靠谱客的博主 哭泣寒风,最近开发中收集的这篇文章主要介绍Oracle数据库实现获取前几条数据的方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Oracle数据库实现获取前几条数据的方法
2012-01-12       0  个评论      
收藏     我要投稿
如何在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数据库实现获取前几条数据的方法的全部内容,希望文章能够帮你解决Oracle数据库实现获取前几条数据的方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部