Oracle - 选择具有潜在重复项的随机行

时间:2015-03-03 17:07:48

标签: sql oracle random oracle11g

我正在使用Oracle 11gR2。给定一个表,我想以随机顺序返回一定数量的行,并且可能存在重复行。

我看过的所有帖子(hereherehere)都是以随机顺序查找多个唯一行。

例如,给定此表并要求2个随机行:

Table
-----------------
ID  LABEL
1   Row 1
2   Row 2
3   Row 3

我希望查询返回

1   Row 1
2   Row 2

但也可能

1   Row 1
1   Row 1

如何仅使用纯SQL(无PL / SQL或存储过程)来完成此操作?源表没有重复的行;副本,我的意思是两行具有相同的ID。

4 个答案:

答案 0 :(得分:2)

选择随机行联合选择另一个随机行

这给你两个完全随机的行,如果两个randoms具有相同的值,或者两个不同的行,它们可以是相同的。关键是做两个随机选择,而不是一个返回两行

如果你想要两行以上,我认为最好的解决方案是拥有一个随机数表,对该表进行全外连接并随机排序,选择该连接的顶部(n)。通过完全外部联接,在选择顶部(n)之前,在结果集中多次使用Sourcetable的每一行

答案 1 :(得分:2)

也许是这样的(p_num是参数):

with sample_data as (select 1 id, 'row 1' label from dual union all
                     select 2 id, 'row 2' label from dual union all
                     select 3 id, 'row 3' label from dual),
           dummy as (select level lvl
                     from   dual
                     connect by level <= p_num)
select *
from   (select sd.*
        from   sample_data sd,
               dummy d
        order by dbms_random.value)
where  rownum <= p_num;

我真的不想在生产代码中使用它,因为我认为它不会很好地扩展。

您的要求背后的原因是什么?这对我来说听起来不是特别好的设计。

答案 2 :(得分:0)

如果没有存储过程,我无法想到任何方法。

你或许能够成为DBMS_RANDOM的原型

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_random.htm#i998925

http://www.databasejournal.com/features/oracle/article.php/3341051/Generating-random-numbers-and-strings-in-Oracle.htm

你可以生成一个随机主键并返回它吗?

答案 3 :(得分:0)

您可以在SQL查询中使用DBMS_RANDOM。

SELECT ID FROM
(
  SELECT ID FROM mytable
ORDER BY dbms_random.value)
WHERE ROWNUM <=2

http://www.sqlfiddle.com/#!4/c6487/13/0