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
您可以生成一个随机主键,然后 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
我正在使用 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
您可以生成一个随机主键,然后 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