[转]Oracle 随机获取N条数据

本文介绍在Oracle数据库中如何实现随机抽取记录的方法,包括使用sys_guid()、dbms_random.value及sample()函数,并对比不同方法在各种平台上的表现,提供了一种有效随机查询的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 当我们获取数据时,可能会有这样的需求,即每次从表中获取数据时,是随机获取一定的记录,而不是每次都获取一样的数据,这时我们可以采取Oracle内部一些函数,来达到这样的目的.   
  2.   
  3.    1) select * from (select * from tablename order by sys_guid()) where rownum < N;    
  4.    2) select * from (select * from tablename order by dbms_random.value) where rownum< N;    
  5.    3) select *  from (select * from table_name sample(10)   order by trunc(dbms_random.value(01000)))  where rownum < N;   
  6.    说明: sample(10)含义为检索表中的10%数据,sample值应该在[0.000001,99.999999]之间.   
  7.   
  8.    其中 sys_guid() 和 dbms_random.value都是内部函数,通过这样的方法,就可以实现我们的需求了.   
  9.   
  10.    注:   
  11.         在使1)方法时,即使用sys_guid() 这种方法时,有时会获取到相同的记录,即和前一次查询的结果集是一样的,我查找了相关资料,有些说是和操作系统有关,在windows平台下正常,获取到的数据是随机的,而在linux等平台下始终是相同不变的数据集,有些说是因为sys_guid()函数本身的问题,即sys_guid()会在查询上生成一个16字节的全局唯一标识符,这个标识符在绝大部分平台上由一个宿主标识符和进程或进程的线程标识符组成,这就是说,它很可能是随机的,但是并不表示一定是百分之百的这样.   
  12.          
  13.        所以,为确保在不同的平台每次读取的数据都是随机的,我们大多采用2)和3)两种方案,其中2)方案更常用.3)方案缩小了查询的范围,在查询大表,且要提取数据不是很不多的情况下,会对查询速度上有一定的提高,   
  14.   
  15.    另:在Oracle中一般获取随机数的方法是:   
  16.   
  17. select trunc(dbms_random.value(01000)) from dual; (0-1000的整数)   
  18. select dbms_random.value(01000) from dual; (0-1000的浮点数)  

 

转自:http://eternal1025.javaeye.com/blog/372522

Oracle 数据库中,可以使用 `ROWNUM` 或者 `FETCH FIRST ROW ONLY` 的方式来检索第一数据。以下是两种实现方法的详细说明: ### 使用 ROWNUM `ROWNUM` 是 Oracle 中的一个伪列,用于为查询结果集中的每一行分配一个唯一的连续编号,从 1 开始。如果需要获取第一记录,可以通过以下 SQL 语句实现: ```sql SELECT * FROM department WHERE ROWNUM = 1; ``` 然而,直接使用 `ROWNUM = 1` 可能无法满足复杂的排序需求。例如,如果需要根据某个字段排序后取第一记录,则需要通过子查询完成[^1]: ```sql SELECT * FROM (SELECT * FROM department ORDER BY DEPT_NO ASC) WHERE ROWNUM = 1; ``` ### 使用 FETCH FIRST ROW ONLY 从 Oracle 12c 开始,支持标准 SQL 的 `FETCH FIRST ROW ONLY` 语法,这是一种更简洁的方式来获取第一记录: ```sql SELECT * FROM department ORDER BY DEPT_NO ASC FETCH FIRST ROW ONLY; ``` 这种方式不仅简单直观,还支持更复杂的分页逻辑,例如获取前 N 记录[^4]。 ### 示例代码 以下是一个完整的示例,展示如何从 `department` 表中按 `DEPT_NO` 升序排列获取第一记录: ```sql -- 方法一:使用 ROWNUM SELECT * FROM (SELECT * FROM department ORDER BY DEPT_NO ASC) WHERE ROWNUM = 1; -- 方法二:使用 FETCH FIRST ROW ONLY SELECT * FROM department ORDER BY DEPT_NO ASC FETCH FIRST ROW ONLY; ``` ### 注意事项 - 如果未指定排序条件(如 `ORDER BY`),返回的第一记录可能是随机的,具体取决于底层存储和查询计划。 - 在使用子查询时,确保内部查询包含明确的排序规则,否则结果可能不符合预期[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值