查询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实例的性能。
可能的重复[从另一个表填充随机数据](https://stackoverflow.com/questions/45510958/populate-random-data-from-another-table) –
对不起,我不得不创建一个红移和postgree ..所以我有两个。 –
为什么你需要创建两个问题?你可以用两个标签问一个问题。但是,您应该始终在您的问题中指出您正在使用哪个数据库,因为答案可能不同(特别是对于Redshift)。 –