带有=符号的where子句匹配多个记录,而只需要一个记录

时间:2017-07-02 12:46:29

标签: sql oracle

我有一个包含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}}

返回每行的整数,但我没有看到任何异常。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

问题是每行重新计算随机值。因此,您可能会得到两个与值匹配的随机值 - 或者遍历所有值并且永远不会受到影响。

解决这个问题的一种方法是:

select d.*
from (select d.*
      from d 
      order by dbms_random.value()
     ) d
where rownum = 1;

有更有效的方法来计算随机数,但这只是对现有查询的简单修改。

你也可能想问另一个问题。此问题以未使用的表的描述开头,然后问题是关于不使用该表的查询。询问另一个问题,描述表格和您遇到的实际问题 - 以及样本数据和所需结果。