我有一个包含两列的表(使用oracle 11g数据库):Country,IndexNumber。表包含10行(10个不同的城市及其唯一索引号。)
例如:
Country IndexNUmber
India 1
Australia 2
. .
. .
. .
. .
US 10
现在我想通过使用dbms_random.value(1,10
生成随机数来从上表中获取随机行。为了达到这个目的,我使用下面的查询:
select * from tab_name where indexnumber = dbms_random.value(1,10);
我无法理解此查询的输出,因为它有时会获取一行,有些时间为零行,有时会超过一行。
有人可以让我了解oracle如何评估此查询。
由于 ANKIT
答案 0 :(得分:1)
由于link
是一个非确定性的PL / SQL函数,因此对于查询评估的每一行,它将被调用一次。
在评估第一行时,函数可能返回4,然后在第二行返回8,等等。
要将每一行与一个随机数进行比较,可以将函数调用转换为标量子查询,例如:
dbms_random.value
由于子查询与主查询无关,因此Oracle只执行一次(对于从表返回的第一行)并记住所有后续行的结果。特别是,如果合适的索引在select * from tab_name where indexnumber = (select dbms_random.value(1,10) from dual);
上,则查询将能够更有效地使用它,因为它知道它正在探测单个值。
答案 1 :(得分:0)
运行原始查询时:
select * from tab_name where indexnumber = dbms_random.value(1,10);
似乎每个记录的dbms_random
子句都会调用where
。换句话说,如果所选的随机数恰好与每条记录的索引匹配,则有可能返回表中的每条记录。如果要检索单个随机记录,请遵循以下模式:
select *
from
( select * from tab_name order by DBMS_RANDOM.VALUE )
where rownum < 2;