从双表中选择确切的行数

时间:2017-09-04 08:52:22

标签: sql oracle dual-table

任务如下:从双表中选择20行,随机生成从23到45的不同数字。

我执行了以下操作:

select distinct floor(dbms_random.value(23,45)) output
from   dual
connect by rownum <= 20;

但它选择小于20的随机行数。例如:

     OUTPUT
        44
        35
        25
        27
        40
        32
        26
        36
        43
        34
        31
        33
        37
13 rows selected.

请帮忙,如何准确选择20个数字,而不是更少?非常感谢!

1 个答案:

答案 0 :(得分:3)

使用行生成器生成所有数字;使用DBMS_RANDOM.VALUE随机排序,然后获取前20行:

SELECT OUTPUT
FROM   (
  SELECT 22 + LEVEL AS OUTPUT
  FROM   DUAL
  CONNECT BY 22 + LEVEL <= 45
  ORDER BY DBMS_RANDOM.VALUE
)
WHERE ROWNUM <= 20

为什么您的代码不起作用

您正在使用的代码可能会随机生成20个不同的数字,但很可能它不会生成20行23到45之间的随机整数,然后 {{1} }子句将删除所有重复项,您可能会有重复项,这将减少20以下的最终行数。

在数学上,它生成的第一行将是唯一的,然后第二行是唯一的,并且,如果先前的行是唯一的,那么第二行中的第二行是唯一的,并且第二行是唯一的。 ......排名第23的机会,第20排是独一无二的。将所有这些概率相乘:

DISTINCT

使用您的方法生成所有20行的概率SELECT probabilities ( number_of_rows, probability ) AS ( SELECT 1, 1 FROM DUAL UNION ALL SELECT number_of_rows + 1, probability * ( 23 - number_of_rows ) / 23 FROM probabilities WHERE number_of_rows < 20 ) SELECT * FROM probabilities; - 可能但不太可能。