日期:2014-05-17  浏览次数:20737 次

oracle dbms_random.value 问题

SQL code
 
 select * from (
 select  decode (level, 2, 80, 75) xx, round(dbms_random.value(1,100)) qq from dual
 connect by level <= 10) where xx >= qq



执行上面的SQL以后会出现
xx qq
80 20
75 46
75 42
75 60
75 51
75 98
75 76
75 92

这样的结果。

下面这两个数据是怎么来的呢?
75 98

75 92

请各位高手教我。 这里先谢谢大家了


------解决方案--------------------
随机函数能产生1-100之间的数据
估计你执行的时候 没有加上where xx >= qq 这个条件吧




------解决方案--------------------
完全复制楼主的SQL在我的数据库上执行没有楼主所有说的问题,所得的结果集严格遵循了xx >= qq的条件,不符合该条件的记录不在结果集中。使用的数据库为oracle 10gSQL本身没有问题,建议楼主更换其它数据库再测试一下。
------解决方案--------------------
是的,我执行了很多次,qq > xx的记录都被过滤掉了,每次执行得到的结果集的行数也不相同,有时是7条,有时是5条。
------解决方案--------------------
怎么筛选出来的呀?不是 xx >= qq,不可能的事呀!!!


------解决方案--------------------
实测结果:Oracle 11g R2


执行了很多次,不会出现不符合要求的记录。
------解决方案--------------------
操作问题吧。
你直接把整条语句选择后再执行,保证不会出这问题。
如果是让工具自己识别整条语句,有时候会取不全,有可能遗漏后面的xx>qq
------解决方案--------------------
我测试的也存在这样的问题,基本上每次都会出现qq>xx的情况。等解决。
------解决方案--------------------
SQL> select * from (
 select decode (level, 2, 80, 75) xx, round(dbms_random.value(1,100)) qq from dual
 connect by level <= 10) where xx >= qq 2 3 ;

XX QQ
---------- ----------
75 3
80 64
75 10
75 42
75 71
75 66
75 63
75 44

8 rows selected.