考虑一下:
UPDATE dest
SET dest_col = (SELECT s.src_col FROM source s
WHERE s.name = 'abc'
ORDER BY random() LIMIT 1 OFFSET 0);
我的目标:在每一行中设置dest.dest_col
一个从子查询匹配的所有值中随机选择的值。
为此,我添加了ORDER BY random() LIMIT 1
. 但这通过选择一次随机值,然后将其设置到dest.dest_col
.
我尝试添加OFFSET 0
(建议在其他答案中作为防止 Postgres 优化子查询的一种方式),但这似乎没有任何效果。
另请注意,我需要它才能在 GCP 上运行的 PostgreSQL 上工作。
子查询只评估一次,因为它不依赖于要更新的行。
您可以添加一个,只是为了强制引擎评估每一行的子查询。例如 if
dest_col
是一个非空数字:或者,如果它不是数字,则任何其他作为数字的列
dest
都可以,或者任何其他涉及要更新的表的列的表达式都不会影响结果但会创建依赖关系。