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

Oracle - select random rows with potential duplicates

我正在使用 Oracle 11gR2。给定一个 table,我想 return 一定数量的随机顺序的行,可能有重复。

我看到的所有帖子(here or here or here 也是)都是关于以随机顺序查找一些 独特的 行。

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

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

我想查询 return

1   Row 1
2   Row 2

但也有可能

1   Row 1
1   Row 1

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

我想不出没有存储过程的方法。

您也许可以起诉 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

您可以生成一个随机主键,然后 return 那?

select 一个随机行并集 select 另一个随机行

这会为您提供两个完全随机化的行,如果两个随机数具有相同的值,则它们可以相同,或者两个不同的行。关键是做两个随机的selects,而不是一个到return两行

如果您想要两行以上,我认为最好的解决方案是使用随机数-table,对该 table 进行完全外部连接并随机排序, select 该连接的顶部 (n)。通过完整的外部连接,在 selecting the top(n)

之前,你的 Sourcetable 的每一行在结果集中多次出现

可能是这样的(其中 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;

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

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

您可以在 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