理解where

时间:2017-11-14 05:36:24

标签: oracle

我有一个包含两列的表(使用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

2 个答案:

答案 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;