我正在使用Oracle 11gR2。给定一个表,我想以随机顺序返回一定数量的行,并且可能存在重复行。
我看过的所有帖子(here或here或here)都是以随机顺序查找多个唯一行。
例如,给定此表并要求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。
答案 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
你可以生成一个随机主键并返回它吗?
答案 3 :(得分:0)
您可以在SQL查询中使用DBMS_RANDOM。
SELECT ID FROM
(
SELECT ID FROM mytable
ORDER BY dbms_random.value)
WHERE ROWNUM <=2