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
您可以生成一个随机主键并将其返回?