select * from 
(
select '1' c1,dbms_random.value(0,1)  m from dual
union select '2' c1,dbms_random.value(0,1)  m from dual
union select '3' c1,dbms_random.value(0,1)  m from dual
union select '4' c1,dbms_random.value(0,1)  m from dual
union select '5' c1,dbms_random.value(0,1)  m from dual
) k
where k.m>0.5上面这段话中,子查询k中,是1-5五条记录,加上一个随机数,列名为m,
而m列在oracle解释时,仍然被解释为dbms_random.value(0,1),从而造成查询的结果不对(大家可以把代码复制到本地,多次执行校验。我已经验证过了,在sql server中也一样效果)。上面的子查询,放到一张表存起来,再查询,肯定没有问题。我想问的是,在不用中间表的情况下,怎么改动能出现想要的结果(我想要的结果其实大家看代码是可以猜出来的:就是为1,2,3,4,5加一个随机数字列,并过滤中加的数字大于0.5的记录)不知道我说清楚了没有,感谢大家参与。

解决方案 »

  1.   

    你连虚拟表都不想建?那考虑用系统表吧.sql server我知道这种系统表,oracle不知道是哪个,自己找找吧.
      

  2.   

    刚才又试了一个,居然在sql server中结果是对的。
    看来,只是oracle的问题了。请oracle的大侠们关注。
      

  3.   

    图发不上去,我把执行语句和结果列在下面:
    -------------------语句---------------
    select * from  
    (
    select '1' c1,dbms_random.value(0,1) m from dual
    union select '2' c1,dbms_random.value(0,1) m from dual
    union select '3' c1,dbms_random.value(0,1) m from dual
    union select '4' c1,dbms_random.value(0,1) m from dual
    union select '5' c1,dbms_random.value(0,1) m from dual
    ) k
    where k.m>0.5--------------结果-----------------
    1 2 0.548894870562049
    2 5 0.266060023377186
      

  4.   

    上面的结果中,第二条  0.266060023377186 明显不是大于0.5的。发现:SQL SERVER与Oracle已经执行效果是不一样的。
    SQL SERVER中,是不可能出现类似的结果的。下面是SQLSERVER中的结果
    select * from  
    (
    select '1' c1,rand() m 
    union select '2' c1,rand() m
    union select '3' c1,rand() m
    union select '4' c1,rand() m
    union select '5' c1,rand() m
    ) k
    where k.m>0.51 0.752806394390671
    2 0.688798689431167
    3 0.96888758647797
    5 0.80985645828913无论怎么执行,执行多少次,都不可能出现<0.5的行
      

  5.   

    要满足楼主的要求,就建个视图吧。只是,这个需求真的很怪。 不保存下来,每次的随机数都不一样,结果也会不一样。CREATE OR REPLACE VIEW view_tmp
    ASselect * from 
    (
    select '1' c1,dbms_random.value(0,1) m from dual
    union select '2' c1,dbms_random.value(0,1) m from dual
    union select '3' c1,dbms_random.value(0,1) m from dual
    union select '4' c1,dbms_random.value(0,1) m from dual
    union select '5' c1,dbms_random.value(0,1) m from dual
    ) k
    where k.m>0.5以后直接查询视图就可以了select * from view_tmp;
      

  6.   

    补充,上述随机数查询,结果出现  < 0.5 的记录也显示出来(明显与查询条件 where k.m > 0.5 不符)。
    这是由随机数 + oracle 的特殊性 造成的。可以做个实验,不建表,通过楼主的语句,基本每次都有 < 0.5 的记录出现。
    换个做法,建表,再查询时,就正常了,不会出现 < 0.5 的记录。结论,oracle 在过滤(where)时,对 随机数 的处理判断逻辑,与 sqlserver 不同。至于不同在哪里,有待楼主自己继续研究了。
      

  7.   

    有时间就自己看看dbms_random的文档吧。
      

  8.   

    有时间你试试就知道了。好像根本不是随机数的问题。而且,已经说过了,在sql server中,是正确的。
    至少说明两个数据库的解释规则是不一样的。
    这个问题只有大家试一下,才会感觉到乐趣。
    我想大家都知道随机数是一个随机的过程,不是用来重现的。但问题是,我随机出来的数,我以后要用,这个还是应该允许的。
    知之为知之,不知为不知,不要用“自己看看文档”之类的话,让人感觉你好像知道了。
    今天中秋,祝大家节日快乐。
      

  9.   

    为了大家更好的参与,我再把问题简化一下。SQL SERVER的
    select * from   
    (
    select '1' c1,rand() m  
    union select '2' c1,rand() m
    union select '3' c1,rand() m
    union select '4' c1,rand() m
    union select '5' c1,rand() m
    ) k
    where k.m>0.5与
    ORACLE的
    select * from  
    (
    select '1' c1,dbms_random.value(0,1) m from dual
    union select '2' c1,dbms_random.value(0,1) m from dual
    union select '3' c1,dbms_random.value(0,1) m from dual
    union select '4' c1,dbms_random.value(0,1) m from dual
    union select '5' c1,dbms_random.value(0,1) m from dual
    ) k
    where k.m>0.5的执行效果不同,怎么让ORACLE与SQLSERVER的效果一样,在不使用中间表存储的情况下。
      

  10.   


    oracle 的特殊性 有哪些呢?
      

  11.   


    确实没有研究过这个dbms_random我说看看文档的意思,是告之里查查文档里有没有明确的说明,oracle体系庞大,知识点多,有很多都是查文档查出了的
      

  12.   


    select * from  
    (
    select '1' c1,'0' || dbms_random.value(0,1) m from dual
    union select '2' c1,'0' || dbms_random.value(0,1) m from dual
    union select '3' c1,'0' || dbms_random.value(0,1) m from dual
    union select '4' c1,'0' || dbms_random.value(0,1) m from dual
    union select '5' c1,'0' || dbms_random.value(0,1) m from dual
    ) k
    where k.m>'0.5'转换成字符串试试
      

  13.   

    还是不行,是oracle处理机制的原因啊
      

  14.   

    dbms_random.value(0,1)换成dbms_random.value(0.5,1)不就行了嘛~
      

  15.   

      with k as 
    (
    select '1' c1,dbms_random.value(0,1) m from dual
    union select '2' c1,dbms_random.value(0,1) m from dual
    union select '3' c1,dbms_random.value(0,1) m from dual
    union select '4' c1,dbms_random.value(0,1) m from dual
    union select '5' c1,dbms_random.value(0,1) m from dual

    select * from k where 1=0
    union select * from k where m>0.5