oracle rownum_,Oracle-ROWNUM跟row_number

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             9 2100020401

11121            10 2100021201

11122             1 2100005401(后面省略)

142 rows selected

(原始表的记录数)

可以自由使用row_number > n的条件进行过滤,因为它是真实产生的一行,不像rownum一样是虚拟的行

SQL> select * from

2  (

3  select a.loan_typ, row_number() over(partition by a.loan_typ order by a.loan_no) drk, a.loan_no

4  from loan_dealer_info a

5  ) t where drk > 3;

LOAN_TYP        DRK LOAN_NO

-------- ---------- --------------------

11101             4 2100000214

11101             5 2100000222

11101             6 2100000230

11101             7 2100000248

11101             8 2100000256

11101             9 210000031301

11101            10 210000032101

11102             4 2100009801

11121             4 2100006401

11121             5 2100012101

11121             6 2100013901

11121             7 2100016301

11121             8 2100019701

11121             9 2100020401

11121            10 2100021201

11122             4 2100015301

11123             4 2100007801

11123             5 2100008601

11123             6 2100009401

11141             4 2100008801

(后面省略)

64 rows selected

reference link: http://sporting426634.blog.sohu.com/157369217.html

-----------------------------------------

有关分页用哪个函数性能的比较,目前数据量较少,暂时看不出来,不过还是搜集了相关的资料,参考一下

http://www.iteye.com/topic/550012

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值