关于sql:Oracle-选择具有潜在重复项的随机行

Oracle - select random rows with potential duplicates

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

我所见过的所有帖子(此处或此处或此处也都是)都是关于随机查找大量唯一行。

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

1
2
3
4
5
6
TABLE
-----------------
ID  LABEL
1   ROW 1
2   ROW 2
3   ROW 3

我希望查询返回

1
2
1   ROW 1
2   ROW 2

但也可能

1
2
1   ROW 1
1   ROW 1

仅使用纯SQL(不使用PL / SQL或存储过程)怎么办?源表没有重复的行;重复表示两行具有相同的ID。


也许是这样的(其中p_num是一个参数):

1
2
3
4
5
6
7
8
9
10
11
12
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;

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

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


选择一个随机行并集选择另一个随机行

这将为您提供两个完全随机的行,如果两个随机数具有相同的值,则可以是相同的行,也可以是两个不同的行。关键是执行两个随机选择,而不是返回两行

如果要多于两行,我认为最好的解决方案是拥有一个随机数表,对该表进行完全外部连接并随机排序,然后选择该连接的top(n)。通过完全外部联接,在选择top(n)

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


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

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

http://www.sqlfiddle.com/#!4/c6487/13/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

您可以生成一个随机主键并将其返回?