在ORACLE中实现SELECT TOP N 由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询。
1、Rownum的意义
批注:rowid也是伪列。只不过是在插入数据库时,该值就确定了,有18长度的字符串
因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列(强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。
所以:
例子:
select rownum,a.* from zj_jzxx a where rownum =1
select rownum,a.* from zj_jzxx a where rownum =10 查不出数据的(非1)
select rownum,a.* from zj_jzxx a where rownum >5查不出数据的
select rownum,a.* from zj_jzxx a where rownum >0(所有数据)
select rownum,a.* from zj_jzxx a where rownum <5(前4条)
即:rownum是每个查询结果中的一个默认字段
2、查出前n条记录中的第m条信息
格式:
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)
例子:
查出第三行的数据
select rownum,b.* from
(selectrownum recno,a.* from (select * from zj_jzxx order by jzrq desc) a
where rownum<= 3 order by rownum asc) b
Where recno = 3
3、查出 第 n到m行的信息
格式:
SELECT * FROM
(
SELECT A.*, rownum r
FROM
(
SELECT *
FROM Articles
ORDER BY PubTime DESC
) A
WHERE rownum <= n ) B
WHERE r > m;
例子:
查出第8到10行的数据
select rownum,b.* from
(select rownum recno,a.* from (select * from zj_jzxx order by jzrq desc) a
where rownum<= 10 order by rownum asc) b
where recno > 7
或者:
select rownum,b.* from
(select rownum recno,a.* from (select * from zj_jzxx order by jzrq desc) a
where rownum<= 10 order by rownum asc) b
where recno between 8 and 10