将所有值与随机值一起插入

时间:2016-01-24 10:07:09

标签: sql random plsql

我有3张桌子:T1,T2和T3 我正试图将数据插入T1,如下所示:

T1.DATA1 = random values from T3.DATA1
T1.DATA2 = T2.DATA2
T1.DATA3 = T2.DATA3

我试过这个问题:我试过这个问题:

INSERT INTO T1 (DATA1, DATA2, DATA3)
SELECT (SELECT DATA1 FROM
(SELECT DATA1 FROM T3
ORDER BY dbms_random.value)
WHERE rownum = 1), DATA2, DATA3
FROM T2;

它会将正确的值返回给DATA2DATA3,但在DATA1中,我在所有行中都有一个生成的随机值。如何修改此查询以在每一行中包含随机值? T2包含大约3000行。

1 个答案:

答案 0 :(得分:1)

此子查询

SELECT DATA1 
FROM (SELECT DATA1 
      FROM T2
      ORDER BY dbms_random.value)
    WHERE rownum = 1

只返回一行,然后重复多次,因为表T2包含行。这就是为什么我们的查询不起作用的原因 以随机顺序插入值(如果我理解你需要的话):

INSERT INTO T1 (DATA1, DATA2, DATA3)
select tt.data1, t.data2, t.data3
  from (select t2.data2, t2.data3, rownum rn
        from t2) t,
       (select data1, row_number() over (order by dbms_random.value) rn
          from t3,
               (select rownum from dual connect by level <= 200) m) tt
 where t.rn = tt.rn

一些解释:子查询t返回data2表的data3t2列的值,子查询tt返回值为{{1}的混洗值} column(值由dbms_random.value排序),然后两个子查询合并为一个。子查询

t3.data1

用于乘以行。如果select rownum from dual connect by level <= 200 表包含15行,则使用乘法子查询的连接结果将生成3000行,其中t3的每一行将重复200次。要乘以另一个值,请将其放在查询中,而不是t3