oracle中实现top N
1.在ORACLE中实现SELECT TOP N
由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询。 字串7
简单地说,实现方法如下所示: 字串4
SELECT 列名1...列名n FROM
字串2
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n) 字串5
WHERE ROWNUM <= N(抽出记录数)
字串5
ORDER BY ROWNUM ASC 字串3
下面举个例子简单说明一下。 字串5
顾客表customer(id,name)有如下数据: 字串7
ID NAME 字串6
01 first 字串4
02 Second 字串5
03 third
04 forth
字串5
05 fifth
字串4
06 sixth
07 seventh
08 eighth 字串7
09 ninth
字串7
10 tenth 字串4
11 last
则按NAME的字母顺抽出前三个顾客的SQL语句如下所示:
字串4
SELECT * FROM
字串9
(SELECT * FROM CUSTOMER ORDER BY NAME)
字串7
WHERE ROWNUM <= 3
字串8
ORDER BY ROWNUM ASC 字串6
输出结果为: 字串3
ID NAME
08 eighth
05 fifth
01 first
字串2
2.在TOP N纪录中抽出第M(M <= N)条记录 字串9
在得到了TOP N的数据之后,为了抽出这N条记录中的第M条记录,我们可以考虑从ROWNUM着手。我们知道,ROWNUM是记录表中数据编号的一个隐藏子段,所以可以在得到TOP N条记录的时候同时抽出记录的ROWNUM,然后再从这N条记录中抽取记录编号为M的记录,即使我们希望得到的结果。
从上面的分析可以很容易得到下面的SQL语句。
字串3
SELECT 列名1...列名n FROM 字串7
(
SELECT ROWNUM RECNO, 列名1...列名nFROM 字串9
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n) 字串6
WHERE ROWNUM <= N(抽出记录数) 字串3
ORDER BY ROWNUM ASC 字串6
) 字串5
WHERE RECNO = M(M <= N)
字串4
同样以上表的数据为基础,那么得到以NAME的字母顺排序的第二个顾客的信息的SQL语句应该这样写:
SELECT ID, NAME FROM 字串6
( 字串5
SELECT ROWNUM RECNO, ID, NAME FROM 字串2
(SELECT * FROM CUSTOMER ORDER BY NAME)
字串7
WHERE ROWNUM <= 3
字串9
ORDER BY ROWNUM ASC ) 字串8
WHERE RECNO = 2 字串6
结果则为:
ID NAME
字串6
05 fifth
3.抽出按某种方式排序的记录集中的第N条记录 字串8
在2的说明中,当M = N的时候,即为我们的标题讲的结果。实际上,2的做法在里面N>M的部分的数据是基本上不会用到的,我们仅仅是为了说明方便而采用。
如上所述,则SQL语句应为:
SELECT 列名1...列名n FROM 字串3
( 字串9
SELECT ROWNUM RECNO, 列名1...列名nFROM
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM <= N(抽出记录数) 字串4
ORDER BY ROWNUM ASC 字串2
)
WHERE RECNO = N
那么,2中的例子的SQL语句则为: 字串5
SELECT ID, NAME FROM
( 字串4
SELECT ROWNUM RECNO, ID, NAME FROM 字串7
(SELECT * FROM CUSTOMER ORDER BY NAME) 字串2
WHERE ROWNUM <= 2 字串2
ORDER BY ROWNUM ASC
字串2
) 字串2
WHERE RECNO = 2
结果为: 字串2
ID NAME 字串7
05 fifth
字串3
4.抽出按某种方式排序的记录集中的第M条记录开始的X条记录
字串1
3里所讲得仅仅是抽取一条记录的情况,当我们需要抽取多条记录的时候,此时在2中的N的取值应该是在N >= (M + X - 1)这个范围内,当让最经济的取值就是取等好的时候了的时候了。当然最后的抽取条件也不是RECNO = N了,应该是RECNO BETWEEN M AND (M + X - 1)了,所以随之而来的SQL语句则为: 字串5
SELECT 列名1...列名n FROM
字串6
( 字串2
SELECT ROWNUM RECNO, 列名1...列名nFROM 字串5
( 字串6
SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
字串3
WHERE ROWNUM <= N (N >= (M + X - 1))
字串1
ORDER BY ROWNUM ASC 字串8
) 字串8
WHERE RECNO BETWEEN M AND (M + X - 1) 字串1
同样以上面的数据为例,则抽取NAME的字母顺的第2条记录开始的3条记录的SQL语句为:
字串7
SELECT ID, NAME FROM 字串2
( 字串6
SELECT ROWNUM RECNO, ID, NAME FROM
(SELECT * FROM CUSTOMER ORDER BY NAME) 字串7
WHERE ROWNUM <= (2 + 3 - 1)
ORDER BY ROWNUM ASC 字串2
) 字串3
WHERE RECNO BETWEEN 2 AND (2 + 3 - 1)
字串9
结果如下:
ID NAME 字串9
05 fifth
字串9
01 first
04 forth 字串7
以此为基础,再扩展的话,做成存储过程,将开始记录数以及抽取记录数为参数,就可以轻松实现分页抽取数据。
字串2


文章评论
共有 0位编程爱好者发表了评论 查看完整内容