引用:
Originally posted by SunnyXu at 2004-6-22 08:58 AM:
楼上的好像不正确呀,他的问题是:
在pl/sql中有张1000条记录的表。如果想随机抽取其中50条记录该如何操作呢?
利用select *from (select *from t order by dbms_random.value) where rownum<50;
只会随机 ...
复制内容到剪贴板
代码:
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> /*
DOC>
DOC>drop table t;
DOC>
DOC>create table t as select * from all_objects where rownum <= 5000;
DOC>*/
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]>
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> set timing on
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]>
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]>
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> select object_name, object_id
2 from ( select object_name, object_id
3 from t
4 where object_name like '%%'
5 order by dbms_random.random )
6 where rownum <= 4;
OBJECT_NAME OBJECT_ID
------------------------------ ----------
/65ddadec__TimeoutImplBase 31405
/a2efb14b_Manager 30951
/782c5acd_XSDFactory 44004
/b7b4a7fc_BorderUIResourceBeve 7980
Elapsed: 00:00:00.57
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> /
OBJECT_NAME OBJECT_ID
------------------------------ ----------
/8d664d2f_ObjectBuilder 43951
/ae48c769_DynaHashTest2 14703
/860c1d1e_HandlerRegistryClien 30343
/6fbd66b5_BeanContextServicesS 8840
Elapsed: 00:00:00.56
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> select object_name, object_id
2 from ( select object_name, object_id
3 from t sample ( 1 )
4 where object_name like '%%'
5 order by dbms_random.random )
6 where rownum <= 4;
OBJECT_NAME OBJECT_ID
------------------------------ ----------
/4ff59575_MetalComboBoxUIMetal 7336
/65fabb7f_ServerInterceptorFac 30355
/7ad01403_schemasHolder 31442
/68f6d056_HTMLDocumentHTMLRead 9498
Elapsed: 00:00:00.01
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> /
OBJECT_NAME OBJECT_ID
------------------------------ ----------
/7e51c6b4_JspBeanFieldInfo 35358
/858cce89_WrappedPlainViewWrap 9450
/19c0b889_NotEmptyHelper 32240
/a995fc24_DropTargetContextPee 10144
Elapsed: 00:00:00.01
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]>
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> set timing off
Using sample made this much faster (but the poster must be on a teeny tiny
machine if it took them 8 seconds to do 5000 rows) Interesting solution. I am responding to a reply why the
dbms_random works.
Doesn't the order by dbms_random do the same as:
select *
from ( select empno, ename, dbms_random.value
from emp
where ename like '%'
order by 3 )
where rownum <= 4
It is confusing that you can specify a number as the order by column or a column
name, or function, if the order by is a function, it is applied to each record
returned and then ordered by that value. Similar to order by substr(ename, 3).