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

如何在没建表的情况下,使执行结果是对的。
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的记录)不知道我说清楚了没有,感谢大家参与。

------解决方案--------------------
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