From:
http://www.orafans.net/2006/09/oracle-random-record.html
工作中经常用到随机数,比如随机抽取奖券,随机抽取某地区的客户样本等。在Oracle中可以非常方便地实现这个功能。
方法1:使用SAMPLE()。
使用sample的语法是:
- SAMPLE
- [ BLOCK ] (sample_percent)
- [ SEED (seed_value) ]
BLOCK: 表示使用随机块例举而不是随机行例举。
sample_percent是随机获取一张表中记录的百分比。比如值为10,那就是表中的随机的百分之10的记录。值必须大于等于.000001,小于100。
seed表示从哪条记录返回,类似于预先设定例举结果,因而每次返回的结果都是固定的。该值必须介于0和4294967295之间。
接下来举例说明:
- SQL> create table zeeno as select * from dba_objects;
-
- Table created.
-
- SQL> select object_name from zeeno sample(10) where rownum=1;
-
- OBJECT_NAME
-
-
- UET$
-
- SQL> /
-
- OBJECT_NAME
-
-
- ICOL$
上面的示例表示从表zeeno中随机抽取10%的记录,并从中选择一条记录。
如果使用seed,则返回固定的集。
- 1* select object_name from zeeno sample(10) seed(10) where rownum=1
- SQL> /
-
- OBJECT_NAME
-
-
- PROXY_ROLE_DATA$
-
- SQL> /
-
- OBJECT_NAME
-
-
- PROXY_ROLE_DATA$
只所以建临时表是因为如下原因:
- SQL> select object_name from dba_objects sample(10)where rownum=1;
- select object_name from dba_objects sample(10)where rownum=1
- *
- ERROR at line 1:
- ORA-01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY,
- etc.
方法2:使用DBMS_RANDOM包。
DBMS_RANDOM有两种主要的使用方法,分别是DBMS_RANDOM.VALUE()和DBMS_RANDOM.RANDOM。
- SQL> select dbms_random.value() from dual;
-
- DBMS_RANDOM.VALUE()
-
- .638206012
-
- SQL> /
-
- DBMS_RANDOM.VALUE()
-
- .312828706
-
- SQL> select dbms_random.value(1,10) from dual
-
- DBMS_RANDOM.VALUE(1,10)
-
- 2.49371361
-
- SQL> /
-
- DBMS_RANDOM.VALUE(1,10)
-
- 1.6890498
有了随机数,抽取随机记录就是一件非常轻松的事情了:
- SQL> select * from (select object_name from zeeno
- 2 order by dbms_random.random)
- 3 where rownum=1;
-
- OBJECT_NAME
-
-
- DBMS_JAVA_TEST
-
- SQL> /
-
- OBJECT_NAME
-
-
- USER_SNAPSHOT_REFRESH_TIMES
-
- SQL> select * from (select object_name from zeeno
- 1 order by ceil(dbms_random.value(1,3))
- 2 )
- 3* where rownum=1
-
- OBJECT_NAME
-
-
- UNDO$
-
- SQL> /
-
- OBJECT_NAME
-
-
- I_USER1
通常情况下我更喜欢使用SAMPLE,因为更加方便。
其他数据库
随机取出n条记录:
1、SqlServer中随机提取数据库记录
- select top n * from table_name order by newid()
2、mysql中随机提取数据库记录
- Select * From table_name order By rand() Limit n
3、Access中随机提取数据库记录
- Select top n * FROM table_name orDER BY Rnd(FId)
FId:为你当前表的ID字段名