将列设置为从另一个表中随机选择的值

kam*_*uel 4 postgresql google-cloud-sql

考虑一下:

UPDATE dest
SET dest_col = (SELECT s.src_col FROM source s
                WHERE s.name = 'abc'
                ORDER BY random() LIMIT 1 OFFSET 0);
Run Code Online (Sandbox Code Playgroud)

我的目标:将每一行设置dest.dest_col为从子查询匹配的所有值中随机选取的值。

为了实现这一点,我添加了ORDER BY random() LIMIT 1. 但这是通过选择一个随机值一次,然后将其设置到dest.dest_col.

我尝试添加OFFSET 0(在其他答案中建议作为防止 Postgres 优化子查询的方法),但这似乎没有任何效果。

另请注意,我需要它才能在 GCP 上运行的 PostgreSQL 上工作。

Dan*_*ité 6

子查询仅计算一次,因为它不依赖于要更新的​​行。

您可以添加一个,只是为了强制引擎评估每一行的子查询。例如,如果dest_col是一个非空数字:

UPDATE dest
SET dest_col = (SELECT s.src_col FROM source s
                WHERE s.name = 'abc'
                ORDER BY random()+dest_col LIMIT 1)
Run Code Online (Sandbox Code Playgroud)

或者,如果它不是数字,则任何其他包含数字的列都dest可以,或者涉及要更新的表列的任何其他表达式都不会影响结果,但会创建依赖关系。