程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle 中 rownum 和 row_number(),rownumrow_number

oracle 中 rownum 和 row_number(),rownumrow_number

編輯:Oracle教程

oracle 中 rownum 和 row_number(),rownumrow_number


  簡單的介紹下oracle 中rownum 和 row_number() 使用,實例演示。

  參照:http://www.cnblogs.com/zjrstar/archive/2006/08/31/491090.html  

  我們先創建一個例子用以說明,偷個懶,就用上面那位童鞋的。

create table student (ID char(6), name VARCHAR2(10));
insert into student values('200001','張一');
insert into student values('200002','王二');
insert into student values('200003','李三');
insert into student values('200004','趙四');
commit;

1)

SQL> select * from student where rownum>=1;

ID NAME
------ ----------
200001 張一
200002 王二
200003 李三
200004 趙四

2)

SQL> select rownum ,t.* from student t where rownum>=1;

ROWNUM ID NAME
---------- ------ ----------
1 200001 張一
2 200002 王二
3 200003 李三
4 200004 趙四

3)

SQL> select rownum ,t.* from student t where rownum <3;

ROWNUM ID NAME
---------- ------ ----------
1 200001 張一
2 200002 王二

4)

SQL> select rownum ,t.* from student t where rownum >=2;

未選定行

SQL>

Why?=>1.rownum是一個偽列;rownum總是從1開始,連續不斷。

5)

SQL> select rownum,t.* from student t order by name desc;

ROWNUM ID NAME
---------- ------ ----------
4 200004 趙四
1 200001 張一
2 200002 王二
3 200003 李三

6)

SQL> select row_number() over(order by name desc) rn ,t.* from student t;

RN ID NAME
---------- ------ ----------
1 200004 趙四
2 200001 張一
3 200002 王二
4 200003 李三

以上5)和6)可以做比較:為什麼兩者的結果rownum和rn不同,注意row_number() over(...)用法。

7)

SQL> select * from (select rownum rn,t.* from student t) tt where tt.rn between
2 and  3;

RN ID NAME
---------- ------ ----------
2 200002 王二
3 200003 李三

這種方式可以分頁取數據,但是請記得上述的5),偽列rownum不是有序的;如果要進行排序的話,請盡量使用 rownumber() over(...)

 

8)

SQL> select * from (select row_number() over(order by name desc) rn ,t.* from st
udent t) tt where tt.rn between 2 and 3;

RN ID NAME
---------- ------ ----------
2 200001 張一
3 200002 王二

9)

SQL> select * from (select rownum rn ,t.* from student t order by name desc)tt w
here tt.rn between 2 and 3;

RN ID NAME
---------- ------ ----------
2 200002 王二
3 200003 李三

請比較8)和9) 理解7)下的注示。

 

好吧,就這麼多吧,我想上面舉得這些例子,已經將rownum 和 row_number 常見用法,以及各自的特征用法都做了舉例。


oracle rownum的問題

你這樣肯定有問題,
rownum是對結果集的編序排列,始終是從1開始,所以你的rownum>2永遠為假,所以就沒記錄返回。。。

rownum只能用於<,如果要用>要麼用rownumber()OVER,要麼就實例化

用ROW_NUMBER() OVER()解決

SELECT empno, ename, job, mgr, hiredate
FROM (SELECT empno, ename, job, mgr, hiredate,
ROW_NUMBER() OVER(ORDER BY empno) rk
FROM emp) t
WHERE rk > 2

或者實例化就可以了
SELECT empno, ename, job, mgr, hiredate
FROM (SELECT empno, ename, job, mgr, hiredate,
rownum rk
FROM emp) t
WHERE rk > 2
 

在SQL Server 2000 是否有 Oracle 中的 ROWNUM 這樣的功可以????

SQL Server 2000沒有,2005以上有一個row_number()函數可以。
你可以用如下類似的方法來實現。

select (select count(*) from table where empid <= b.empid) as rownumber,* from table as b order by empid
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved