【问题标题】:Insert all values together with random values将所有值与随机值一起插入
【发布时间】:2016-01-24 10:07:08
【问题描述】:

我有 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 行。

【问题讨论】:

  • “来自 T2 的 DATA1 以随机顺序”是否足够随机?或者你还需要什么?
  • 你想洗牌来自DATA1列的数据吗?

标签: sql random plsql


【解决方案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返回t2表的data2data3列的值,子查询tt返回t3.data1列的洗牌值(值按dbms_random.value排序),然后两个子查询合二为一。子查询

select rownum from dual connect by level <= 200

用于将行相乘。如果t3 表包含 15 行,则与子查询相乘的连接结果产生 3000 行,其中来自t3 的每一行将重复 200 次。要乘以另一个值,请将其放在查询中,而不是 200

【讨论】:

  • 感谢@Dmitry,我完全忘记了我有第三张桌子,我需要这些随机值。我编辑了我的帖子,您也可以编辑您的答案吗?我正在查看您的帖子并试图弄清楚如何实现它
  • 此查询仅返回 T3 中行数的结果。我的 T1 是空的,T2 有 3000 行,T3 有 15 行。并且此查询仅返回 15 行,其中包含来自 T3 的随机值和来自 T2 的值。
  • @mauekunak 你之前没有提到过。那么T2T3 的值需要做什么呢?重复 T3 值 200 次(生成 3000 行)或剪切 T2
  • 井 T3 有主键。我认为行数不必相同,只需将 T3.DATA1 中的任何随机值放入 T1.DATA1 即可。如果我们需要重复它以获得 3000 行,那么是的,这就是我所需要的
  • @mauekunak 再次更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
相关资源
最近更新 更多