2017-08-06 103 views
2
update testdata.dataset1 
    set abcd = (select abc 
       from dataset2 
       order by random() 
       limit 1 
      ) 

这样做插入随机数据列各行不仅使从表dataset2一个随机条目在dataset1表中的所有行得到填充。红移:更新或从另一个表

我需要的是从dataset2表到dataset1表中生成随机输入的每一行。

注意:dataset1可以大于dataset2

+1

可能的重复[从另一个表填充随机数据](https://stackoverflow.com/questions/45510958/populate-random-data-from-another-table) –

+0

对不起,我不得不创建一个红移和postgree ..所以我有两个。 –

+0

为什么你需要创建两个问题?你可以用两个标签问一个问题。但是,您应该始终在您的问题中指出您正在使用哪个数据库,因为答案可能不同(特别是对于Redshift)。 –

回答

1

查询1

你应该通过abcd到您的子查询,以防止 “优化”。

UPDATE dataset1 
    SET abcd = (SELECT abc 
       FROM dataset2 
       WHERE abcd = abcd 
       ORDER BY random() 
       LIMIT 1 
       ); 

SQL Fiddle

查询2

下面的查询应该是在普通的PostgreSQL更快。

UPDATE dataset1 
    SET abcd = (SELECT abc 
       FROM dataset2 
       WHERE abcd = abcd 
       OFFSET floor(random()*(SELECT COUNT(*) FROM dataset2)) 
       LIMIT 1 
       ); 

SQL Fiddle

但是,正如你所报道的,它不是红移,这是一列存储的情况。

查询3

抓取所有的单个查询从dataset2记录会比获取记录逐一更有效。让我们来测试:

UPDATE dataset1 original 
SET abcd = fake.abc FROM 
       (SELECT ROW_NUMBER() OVER(ORDER BY random()) AS id, abc FROM dataset2) AS fake 
       WHERE original.id % (SELECT COUNT(*) FROM dataset2) = fake.id - 1; 

SQL Fiddle

注意,整数id列应在dataset1存在。
另外,对于dataset1.id的大于dataset2中的记录数的情况,abcd是可预测的。

查询4

让我们在dataset1创建整数fake_id列,使用随机值充液,并执行加入对dataset1.fake_id = dataset2.id

UPDATE dataset1 
SET fake_id = floor(random()*(SELECT COUNT(*) FROM dataset2)) + 1; 

UPDATE dataset1 
SET abcd = abc 
FROM dataset2 
WHERE dataset1.fake_id = dataset2.id; 

SQL Fiddle

查询5

如果你不想fake_id列添加到dataset1,让我们计算 “对飞” fake_id的:

UPDATE dataset1 
SET abcd = abc 
FROM (
SELECT with_fake_id.id, dataset2.abc FROM 
(SELECT dataset1.id, floor(RANDOM()*(SELECT COUNT(*) FROM dataset2) + 1) AS fake_id FROM dataset1) AS with_fake_id 
JOIN dataset2 ON with_fake_id.fake_id = dataset2.id) AS joined 
WHERE dataset1.id = joined.id; 

SQL Fiddle


性能

在普通PostgreSQL,查询4似乎是最有效的。
我会尝试比较试用DC1.Large实例的性能。

+0

是红移? –

+0

这似乎是工作,但它更新3密耳行缓慢...任何优化查询或任何其他替代品的方式使它快一点? –

+0

我已更新答案。 –