Postgresql

將列設置為從另一個表中隨機選擇的值

  • September 22, 2021

考慮一下:

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 上工作。

子查詢只評估一次,因為它不依賴於要更新的行。

您可以添加一個,只是為了強制引擎評估每一行的子查詢。例如 ifdest_col是一個非空數字:

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

或者,如果它不是數字,則任何其他作為數字的列dest都可以,或者任何其他涉及要更新的表的列的表達式都不會影響結果但會創建依賴關係。

引用自:https://dba.stackexchange.com/questions/215692