日期:2014-05-16  浏览次数:20375 次

Oracle--ROWNUM和row_number

<转>

Rownum对小于某值的查询条件是人为true的,rownum对于大于某值的查询条件直接认为是false的。

(乍看这句话还真是不理解,不过慢慢往下看就好……)


理解rownum的关键是Oracle如何执行查询语句。如果先执行笛卡尔集运算,再执行where条件限制,那么rownum就可以实现rownum> n(n>=1)的功能。但oralce是边执行笛卡尔集运算,边应用选择条件,所以rownum>n(n>1=)永远不成立;
ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说,rownum是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值;
注意:rownum不能以任何基表的名称作为前缀
用ROWNUM = 1可以得到一条记录:
SQL> select seq, fee_cde from tmp_session_01 where rownum = 1;

? SEQ FEE_CDE
----- ----------
??? 1 B01

Rownum > 1没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录;
SQL> select seq, fee_cde from tmp_session_01 where rownum > 1;

? SEQ FEE_CDE
----- ----------

用ROWNUM >= 1 可以返回所有记录,因为第一条件记录满足rownum = 1的条件;记录集添加下一条记录时,rownum = 2也满足rownum>1的条件;后面的记录也会依次像第二条一样添加进来。
SQL> select seq, fee_cde from tmp_session_01 where rownum >= 1;

? SEQ FEE_CDE
----- ----------
??? 1 B01
??? 1 L01
??? 2 B01
??? 3 B01

用ROWNUM >= 2 不会返回记录:
SQL> select seq, fee_cde from tmp_session_01 where rownum >= 2;

? SEQ FEE_CDE
----- ----------

用rownum < 2返回第2条之前,即第1条记录:
SQL> select seq, fee_cde from tmp_session_01 where rownum < 2;

? SEQ FEE_CDE
----- ----------
??? 1 B01

用子查询其他方法就可以返回某个区间的记录:
SQL> select * from (select rownum no, seq, fee_cde from tmp_session_01 where rownum <4) where no > 2;

??????? NO?? SEQ FEE_CDE
---------- ----- ----------
???????? 3???? 2 B01

?

row_number():
和rownum差不多,功能更强一点,可以在各个分组内从1重新排序;但是必须和开窗函数一起使用,也就是说必须分组。

(详细链接:http://chenxy.blog.51cto.com/blog/729966/728838)

SQL> select a.loan_typ, row_number() over(partition by a.loan_typ order by a.loan_no) drk, a.loan_no
? 2? from loan_dealer_info a;

LOAN_TYP??????? DRK LOAN_NO
-------- ---------- --------------------
11101???????????? 1 2100000131
11101???????????? 2 2100000199
11101???????????? 3 2100000206
11101???????????? 4 2100000214
11101???????????? 5 2100000222
11101???????????? 6 2100000230
11101???????????? 7 2100000248
11101???????????? 8 2100000256
11101???????????? 9 210000031301
11101??????????? 10 210000032101
11102???????????? 1 2100002201
11102???????????? 2 2100003001
11102???????????? 3 2100006401
11102???????????? 4 2100009801
11114???????????? 1 2100001901
11116???????????? 1 2100011401
11121???????????? 1 2100002201
11121???????????? 2 2100004801
11121???????????? 3 2100005601
11121???????????? 4 2100006401

LOAN_TYP??????? DRK LOAN_NO
-------- ---------- --------------------
11121???????????? 5 2100012101
11121???????????? 6 2100013901
11121???????????? 7 2100016301
11121???????????? 8 2100019701
11121??