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的记录)不知道我说清楚了没有,感谢大家参与。
(
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的记录)不知道我说清楚了没有,感谢大家参与。
看来,只是oracle的问题了。请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--------------结果-----------------
1 2 0.548894870562049
2 5 0.266060023377186
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的行
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;
这是由随机数 + oracle 的特殊性 造成的。可以做个实验,不建表,通过楼主的语句,基本每次都有 < 0.5 的记录出现。
换个做法,建表,再查询时,就正常了,不会出现 < 0.5 的记录。结论,oracle 在过滤(where)时,对 随机数 的处理判断逻辑,与 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.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的效果一样,在不使用中间表存储的情况下。
oracle 的特殊性 有哪些呢?
确实没有研究过这个dbms_random我说看看文档的意思,是告之里查查文档里有没有明确的说明,oracle体系庞大,知识点多,有很多都是查文档查出了的
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'转换成字符串试试
(
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