Oracle中ROWNUM的使用技巧Word格式.docx
- 文档编号:15047794
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:10
- 大小:16.76KB
Oracle中ROWNUM的使用技巧Word格式.docx
《Oracle中ROWNUM的使用技巧Word格式.docx》由会员分享,可在线阅读,更多相关《Oracle中ROWNUM的使用技巧Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
利用ROWNUM,我们可以生产一些原先难以实现的结果输出,但因为它是伪列的这个特殊性,我们在使用时也需要注意一些事项,不要掉入“陷阱”。
下面就介绍一下它的使用技巧及注意事项。
1特殊结果输出
利用ROWNUM,我们可以做到一些特殊方式的输出。
1.1TopN结果输出
我们如果希望取输出结果的前面几条数据,通过ROWNUM可以轻松实现:
SQL>
select*fromt_test4
2whererownum<
=5;
USERNAMEUSER_IDCREATED
-------------------------------------------------
WOW7126-APR-07
CS27015-JAN-07
36901-NOV-06
DMP6812-OCT-06
PROFILER6705-SEP-06
但是,如果你希望对一个排序结果取TopN数据的话,使用ROWNUM存在一些“陷阱”,我们后面部分会介绍这些“陷阱”并且说明如何避免。
1.2分页查询
利用ROWNUM对结果进行分页,下面返回结果中的第6到第10条记录:
select*from
2(
3selecta.*,rownumasrnfromcss_bl_viewa
4wherecapture_phone_num='
(1)925-4604800'
5)b
6whereb.rnbetween6and10;
6rowsselected.
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE(Cost=2770Card=2183Bytes=7166789)
10VIEW(Cost=2770Card=2183Bytes=7166789)
21COUNT
32TABLEACCESS(FULL)OF'
CSS_BL_VIEW'
(Cost=2770Card=2183Bytes=1305434)
Statistics
0recursivecalls
0dbblockgets
29346consistentgets
29190physicalreads
0redosize
7328bytessentviaSQL*Nettoclient
234bytesreceivedviaSQL*Netfromclient
4SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
5rowsprocessed
另外一种实现方式:
select*fromcss_bl_viewa
2wherecapture_phone_num='
3andrownum<
=10
4minus
5select*fromcss_bl_viewa
6wherecapture_phone_num='
7andrownum<
=5
8;
0SELECTSTATEMENTOptimizer=CHOOSE(Cost=5920Card=10Bytes=8970)
10MINUS
21SORT(UNIQUE)(Cost=2960Card=10Bytes=5980)
32COUNT(STOPKEY)
43TABLEACCESS(FULL)OF'
51SORT(UNIQUE)(Cost=2960Card=5Bytes=2990)
65COUNT(STOPKEY)
76TABLEACCESS(FULL)OF'
62consistentgets
50physicalreads
7232bytessentviaSQL*Nettoclient
2sorts(memory)
第三种实现方式:
5andrownum<
6)b
7whereb.rn>
5;
0SELECTSTATEMENTOptimizer=CHOOSE(Cost=2770Card=10Bytes=32830)
10VIEW(Cost=2770Card=10Bytes=32830)
21COUNT(STOPKEY)
35consistentgets
30physicalreads
7271bytessentviaSQL*Nettoclient
这里特地将三种实现方式的查询计划及统计数据打印出来,大家可以比较一下3中方式的性能。
1.3利用ROWNUM做分组子排序
对于以下表T_TEST4的内容:
OWNERNAME
------------------------------------------------------
STRMADMINSTREAMS_QUEUE
APARKMANJOB_QUEUE
SYSAQ$_AQ_SRVNTFN_TABLE_E
SYSAQ$_KUPC$DATAPUMP_QUETAB_E
APARKMANAQ$_JMS_TEXT_E
STRMADMINAQ$_STREAMS_QUEUE_TABLE_E
SYSAQ$_SCHEDULER$_EVENT_QTAB_E
…
如果我们希望结果按照OWNER进行分组后,再对每组中成员进行编号,结果类似如下:
OWNERNONAME
APARKMAN1JOB_QUEUE
2AQ$_JMS_TEXT_E
STRMADMIN1STREAMS_QUEUE
2AQ$_STREAMS_QUEUE_TABLE_E
SYS1AQ$_AQ_SRVNTFN_TABLE_E
2AQ$_KUPC$DATAPUMP_QUETAB_E
3AQ$_SCHEDULER$_EVENT_QTAB_E
在没有ROWNUM时要实现这样的功能会很复杂,但通过ROWNUM我们可以轻松实现:
SELECTDECODE(ROWNUM-min_sno,0,a.owner,NULL)owner,DECODE(ROWNUM-min_sno,0,1,rownum+1-min_sno)sno,a.name
2FROM(SELECT*
3FROMt_test8
4ORDERBYowner,name)a,
5(SELECTowner,MIN(rownum)min_sno
6FROM(SELECT*
7FROMt_test8
8ORDERBYowner,name)
9GROUPBYowner)b
10WHEREa.owner=b.owner;
OWNERSNONAME
----------------------------------------------------------------------
4AQ$_SCHEDULER$_JOBQTAB_E
5AQ$_STREAMS_QUEUE_TABLE_E
6AQ$_SYS$SERVICE_METRICS_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle ROWNUM 使用 技巧
![提示](https://static.bdocx.com/images/bang_tan.gif)