Oracle中ROWNUM的使用技巧 [English] 作者: fuyuncat 来源: http://www.HelloDBA.com 日期: 2009-02-14 14:54:36 ROWNUM是一种伪列,它会根据返回记录生成一个序列化的数字。利用ROWNUM,我们可以生产一些原先难以实现的结果输出,但因为它是伪列的这个特殊性,
Oracle中ROWNUM的使用技巧
[English]
作者:fuyun本文来源[email protected]搞@^&代*@码)网9cat
日期:2009-02-14 14:54:36
ROWNUM是一种伪列,它会根据返回记录生成一个序列化的数字。利用ROWNUM,我们可以生产一些原先难以实现的结果输出,但因为它是伪列的这个特殊性,我们在使用时也需要注意一些事项,不要掉入“陷阱”。下面就介绍一下它的使用技巧及注意事项。
1 特殊结果输出
利用ROWNUM,我们可以做到一些特殊方式的输出。
1.1 Top N结果输出
我们如果希望取输出结果的前面几条数据,通过ROWNUM可以轻松实现:
<code>SQL> select * from t_test4</code>
<code> 2 where rownum <= 5;</code>
<code> </code>
<code>USERNAME USER_ID CREATED</code>
<code>------------------------------ ---------- ---------</code>
<code>WOW 71 26-APR-07</code>
<code>CS2 70 15-JAN-07</code>
<code>3 69 01-NOV-06</code>
<code>DMP 68 12-OCT-06</code>
<code>PROFILER 67 05-SEP-06</code>
但是,如果你希望对一个排序结果取Top N数据的话,使用ROWNUM存在一些“陷阱”,我们后面部分会介绍这些“陷阱”并且说明如何避免。
1.2 分页查询
利用ROWNUM对结果进行分页,下面返回结果中的第6到第10条记录:
<code>SQL> select * from</code>
<code> 2 (</code>
<code> 3 select a.*, rownum as rn from css_bl_view a</code>
<code> 4 where capture_phone_num = '(1) 925-4604800'</code>
<code> 5 ) b</code>
<code> 6 where b.rn between 6 and 10;</code>
<code> </code>
<code>6 rows selected.</code>
<code> </code>
<code> </code>
<code>Execution Plan</code>
<code>----------------------------------------------------------</code>
<code> 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2770 Card=2183 Bytes =7166789)</code>
<code> 1 0 VIEW (Cost=2770 Card=2183 Bytes=7166789)</code>
<code> 2 1 COUNT</code>
<code> 3 2 TABLE ACCESS (FULL) OF 'CSS_BL_VIEW' (Cost=2770 Card=2183 Bytes=1305434)</code>
<code> </code>
<code> </code>
<code>Statistics</code>
<code>----------------------------------------------------------</code>
<code> 0 recursive calls</code>
<code> 0 db block gets</code>
<code> 29346 consistent gets</code>
<code> 29190 physical reads</code>
<code> 0 redo size</code>
<code> 7328 bytes sent via SQL*Net to client</code>
<code> 234 bytes received via SQL*Net from client</code>
<code> 4 SQL*Net roundtrips to/from client</code>
<code> 0 sorts (memory)</code>
<code> 0 sorts (disk)</code>
<code> 5 rows processed</code>