如何从oracle数据库中随机获取记录?

时间:2012-03-26 07:50:26

标签: oracle select random

我需要随机选择行。例如:让我们假设,一个表包含100条记录,但我需要从这100条记录中只获得20条记录,并且记录选择将随机出现..我将如何从中出来?我使用oracle作为我的数据库。任何建议都会对我有所帮助。  提前谢谢..

9 个答案:

答案 0 :(得分:93)

SELECT *
FROM   (
    SELECT *
    FROM   table
    ORDER BY DBMS_RANDOM.VALUE)
WHERE  rownum < 21;

答案 1 :(得分:37)

SAMPLE() 保证不能为您提供20行,但可能适合(并且可能比完整查询的效果明显更好+大型表随机排序):

SELECT *
FROM   table SAMPLE(20);

注意:这里的20是一个近似百分比,而不是所需的行数。在这种情况下,由于您有100行,要获得大约20行,您需要20%的样本。

答案 2 :(得分:12)

SELECT * FROM table SAMPLE(10) WHERE ROWNUM <= 20;

这样更有效,因为它不需要对表进行排序。

答案 3 :(得分:8)

SELECT column FROM
( SELECT column, dbms_random.value FROM table ORDER BY 2 )
where rownum <= 20;

答案 4 :(得分:4)

要随机选择20行,我认为最好选择随机排序的那一批并选择该组的前20行。

类似的东西:

Select *
  from (select *
          from table
         order by dbms_random.value) -- you can also use DBMS_RANDOM.RANDOM
 where rownum < 21;

最好用于小型表格,以避免选择大块数据,只是为了丢弃大部分数据。

答案 5 :(得分:2)

总的来说,介绍了两种方法

1) using order by DBMS_RANDOM.VALUE clause
2) using sample([%]) function

第一种方法在“ CORRECTNESS”中具有优势,这意味着如果结果确实存在,您将永远不会失败,而在第二种方法中,即使满足查询条件的情况也可能不会获得任何结果,因为采样期间信息会减少

第二种方法在'EFFICIENT'中具有优势,这意味着您将更快地获得结果并减轻数据库的负担。 来自DBA的警告是我使用第一种方法的查询会给数据库带来负载

您可以根据自己的兴趣选择两种方式之一!

答案 6 :(得分:1)

在大型表的情况下,按dbms_random.value排序的标准方法无效,因为您需要扫描整个表,而dbms_random.value的功能相当慢,需要上下文切换。对于这种情况,还有3种其他方法:


1:使用sample子句:

例如:

select *
from s1 sample block(1)
order by dbms_random.value
fetch first 1 rows only

即得到所有块的1%,然后将它们随机排序并仅返回1行。


2:如果您在具有正态分布的列上具有索引/主键,则可以获取最小值和最大值,获取该范围内的随机值,并获取值大于或等于第一行等于随机生成的值。

示例:

--big table with 1 mln rows with primary key on ID with normal distribution:
Create table s1(id primary key,padding) as 
   select level, rpad('x',100,'x')
   from dual 
   connect by level<=1e6;

select *
from s1 
where id>=(select 
              dbms_random.value(
                 (select min(id) from s1),
                 (select max(id) from s1) 
              )
           from dual)
order by id
fetch first 1 rows only;

3:获取随机表块,生成rowid并通过该rowid从表中获取行

select * 
from s1
where rowid = (
   select
      DBMS_ROWID.ROWID_CREATE (
         1, 
         objd,
         file#,
         block#,
         1) 
   from    
      (
      select/*+ rule */ file#,block#,objd
      from v$bh b
      where b.objd in (select o.data_object_id from user_objects o where object_name='S1' /* table_name */)
      order by dbms_random.value
      fetch first 1 rows only
      )
);

答案 7 :(得分:0)

以下是从每个组中随机抽取一个样本的方法:

SELECT GROUPING_COLUMN, 
       MIN (COLUMN_NAME) KEEP (DENSE_RANK FIRST ORDER BY DBMS_RANDOM.VALUE) 
         AS RANDOM_SAMPLE
FROM TABLE_NAME
GROUP BY GROUPING_COLUMN
ORDER BY GROUPING_COLUMN;

我不确定它的效率如何,但是如果您有很多类别和子类别,这似乎可以很好地完成工作。

答案 8 :(得分:-1)

我们必须使用一些查询,这将使我们从

我们有教师桌

Oracle语法

SELECT * FROM   
(
SELECT column_name FROM table_name  
ORDER BY dbms_random.value
)  
WHERE rownum = 1;

For better understanding follow screenshot