首页 > 解决方案 > 为每一行选择随机值

问题描述

假设我有 2 个表名为“FOR_TEST_1”,列 A、B、C 和“FOR_TEST_2”列 D、E、F。

我想生成 A 列与 D 列中的随机值配对。

这是表格的片段。

表 FOR_TEST_1

表 FOR_TEST_2

到目前为止,这是我一直在做的语句,它为 A 中的每一行返回相同的 D 值。

查询结果

目前我正在使用 toad for oracle,但我尝试在 MySQL 中使用相同的逻辑,它工作正常。

标签: sqloraclerandom

解决方案


您期望 Oracle 每行执行一次子查询(这是 MySQL 所做的)。但是,您似乎遇到了 Oracle 优化的副作用。主查询和标量子查询之间没有关联,因此 Oracle 决定取消嵌套子查询,执行一次并将结果连接到主查询。

要获得您想要的结果,您有几个选择。一种是使用提示关闭取消嵌套NO_UNNEST

select   t1.a
       ,  ( select d from ( select /*+ NO_UNNEST */  d from for_test_two 
            order by dbms_random.value ) where rownum = 1) d
from for_test_one t1
/

或者,您可以重写查询以使用内联视图而不是标量子查询。

select t1.a
       , t2.d
from ( select a, rownum as rn 
        from for_test_one) t1
     join ( select d, rownum as rn 
         from ( select d from for_test_two 
                order by dbms_random.value() ) ) t2
     on t1.rn = t2.rn
order by t1.rn
/

警告:该NO_UNNEST解决方案不适用于 SQL Fiddle 演示(在此处找到)。不知道为什么,语法看起来是正确的。因此,在您的环境中尝试一下,或者只使用第二种方法,这绝对有效。


推荐阅读