Oracle 9iselect rid, mb_name from(
select rownum rid,mb_name from tb_manbase
) where mod(rid, mod(abs(dbms_random.random()),200))=0
                                               ^^^
请问返回的结果集中, 前后两行记录其字段rid的值差会否大于200?
注: 本人只是想从千万行级的表中随机取出一些样本数据而已
    (数据需要具有一定的离散性),
    又懒得手动写程序, 就想了这么个用法.    写完后, 在小规模表中运行一下, 发现结果似乎很理想,
    只是不明白Oracle内部是如何分析处理这种嵌套关联子
    查询的. 类似的这种查询, 在不同的DBMS实现上, 会否
    出现完全不同的逻辑解释.

解决方案 »

  1.   

    Oracle 9iselect rid, mb_name from(
    select rownum rid,mb_name from tb_manbase
    ) where mod(rid, mod(abs(dbms_random.random()),200))=0
                                                   ^^^
    请问返回的结果集中, 前后两行记录其字段rid的值差会否大于200?Answer:
    1.你想看执行步骤,用explain plan2.前后两行记录其字段rid的值差完全可能大于200
    mod(abs(dbms_random.random()),200)
    --这步你取了一个随机数的绝对值,然后让绝对值对200取余,结果得到数X是>0 && <200的(rid不可能为0,因为rownum > 0)mod(rid, mod(abs(dbms_random.random()),200))=0 
    --然后你又让rid(也就是行号)对前面得到的结果X取余,要求结果为0,也就是说rid为X的自然数倍,所以你无法保证得到你要的结果