oracle向表写入单条记录,在oracle中,怎么从一张表中查询一条随机记录

SQL code--在oracle里面,分页请使用rownum,oracle不支持mysql的limit分页

SQL> select *

2 from (

3 select owner,object_name,created,status

4 from all_objects

5 order by dbms_random.value)

6 where rownum=1

7 /

OWNER OBJECT_NAME CREATED STATUS

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

DMSYS DM_CL_BUILD 2004-03-10 VALID

SQL> /

OWNER OBJECT_NAME CREATED STATUS

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

SYS java/beans/MethodDescriptor 2004-03-10 VALID

SQL> /

OWNER OBJECT_NAME CREATED STATUS

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

SYS /a4b44102_JavacErrorsText_zh_T 2004-03-10 VALID

SQL> /

OWNER OBJECT_NAME CREATED STATUS

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

PUBLIC /a5244b44_JobImpressionsComple 2004-03-10 VALID

SQL> /

OWNER OBJECT_NAME CREATED STATUS

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

PUBLIC sqlj/util/BlockDescriptor 2004-03-10 VALID

------解决方案--------------------

上面的想法是好的,但却无法完全满足随机这个概念,同时,还存在小问题。

问题:

表字段数量 < dbms_random.value , 是否会报错,导致无法执行?

建议,考虑指定随机数的范围。

疑问:

按上面的解法,只是随机按某个字段排序,有一定随机性,但随机范围仍然受到限制,并未达到完全随机的要求。

目前所能想到的解法,按行号进行随机抽取。

1. 所有数据行手工给定行号

2. 随机抽取一行号(通过随机函数)

但缺点也是明显的,就是性能。 如果表中数据较多时,需要花费很长时间。

所以,等待高人给出一个更为合理的解决方案。

------解决方案--------------------SQL code--从一个表中随机取一条记录

--1.dbms_random.value

select * from(select * from table1 order by dbms_random.value) where rownum < 2;

--2.dbms_random.random

select * from(select * from table1 order by dbms_random.random) where rownum < 2;

--3.sys_guid()

select * from(select * from table1 order by sys_guid()) where rownum < 2;

--4.sample(20) 按百分比

select * from(select * from table1 sample(20)) where rownum < 2;

--5.sample block(20) 按数据块

select * from(select * from table1 sample block(40)) where rownum < 2;

------解决方案--------------------SQL code--确实,随机数应该有个范围,下面我们来找出 <=50的随机数,这里去5个

select r

from (

select r

from (

select rownum r

from all_objects

where rownum <= 50)

order by dbms_random.value)

where rownum <= 5

/

R

----------

36

14

41

38

46

SQL> /

R

----------

34

3

42

45

37

SQL> /

R

----------

4

36

5

9

49

SQL> /

R

----------

31

15

29

26

39

SQL> /

R

----------

20

14

29

43

48

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值