SQL> create table a(val char(1));表已创建。SQL> insert into a values('a');已创建 1 行。SQL> insert into a values('b');已创建 1 行。SQL> insert into a values('c');已创建 1 行。SQL> commit;提交完成。SQL> select * from a;VA
--
a
b
cSQL> select * from (
  2  select rownum rn,val from a)
  3  where rn=round(dbms_random.value(1,rn));        RN VA
---------- --
         1 aSQL> /        RN VA
---------- --
         1 a
         3 cSQL> /        RN VA
---------- --
         1 a
         2 bSQL> /        RN VA
---------- --
         1 a
         2 bSQL> /        RN VA
---------- --
         1 a
为什么有时返回多个值?

解决方案 »

  1.   

    select rownum rn,round(dbms_random.value(1, rownum)) from a;多运行几次,看看这结果就应该知道了
      

  2.   

    原因很简单啊:
    因为这个select rownum rn,val from a 集合的数据是多行。
      

  3.   

    这个相当于再加一层嵌套查询了。
    相当于遍历一下round(dbms_random.value(1,rn))
    比如当rn=1的时候round(dbms_random.value(1,rn))就等于1所以第一行肯定取出
    当rn=2的时候dbms_random.value(1,2)可能再1-1.5之间那么round(dbms_random.value(1,rn))就等于1了这个时候rn<>round(dbms_random.value(1,rn));
    而dbms_random.value(1,2)可能为1.5-2这个时侯rn<>round(dbms_random.value(1,rn))
    所以也可能出现第二行
    同理也可能出现第三行。
      

  4.   

    但是我的查询条件是rn=round(..),不是rn in ...;这个rn=不是只执行一次吗?那再问下,上面这个表,如何随机取一条数据呢?
      

  5.   

    原因是rownum的概念问题,出现两个的原因是当时返回来的是2,Oracle规定如果要用rownum的返回值时,rownum的值是从1开始累计的,只有有1了才能用的2,如果返回的是3,那1和2必须存在的。所以要么报错,要么就自动转成in功能,全部显示了。你可以看看rownum的概念就明白了。
      

  6.   

    不要用rowmun,用这个试试
    select *
      from (select val from aa
     order by dbms_random.value)
     where rownum = 1;
      

  7.   

    楼上说的很对,由于,  select rownum rn,val from a 中取得的值共有三条
      而round(dbms_random.value(1,rn));是一个随机条件,在外查询时,每条记录的where条件都有可能成立
    或不成立即(成立1次、两次、三次),故查询结果会是一条、两条、三条不等。