我有一个包含2列的简单内联视图。
rn | val
-----------------
0 | A
... | ...
25 | Z
val
我正在尝试通过使用rn
方法随机匹配dbms_random.value()
来选择 with d (rn, val) as
(
select level-1, chr(64+level) from dual connect by level <= 26
)
select * from d
where rn = floor(dbms_random.value()*25)
;
>>select floor(dbms_random.value()*25) from dual connect by level <1000
我的期望是它应该只返回一行而不会失败。 但是偶尔我会得到多行返回或者根本没有行。
另一方面,
{{1}}
返回每行的整数,但我没有看到任何异常。
我在这里缺少什么?
答案 0 :(得分:0)
问题是每行重新计算随机值。因此,您可能会得到两个与值匹配的随机值 - 或者遍历所有值并且永远不会受到影响。
解决这个问题的一种方法是:
select d.*
from (select d.*
from d
order by dbms_random.value()
) d
where rownum = 1;
有更有效的方法来计算随机数,但这只是对现有查询的简单修改。
你也可能想问另一个问题。此问题以未使用的表的描述开头,然后问题是关于不使用该表的查询。询问另一个问题,描述表格和您遇到的实际问题 - 以及样本数据和所需结果。