将 PGSQL 中的多行更新为相同的值

Updating multiple rows in PGSQL to the same value

如果之前有人问过这个问题,我深表歉意,但我在谷歌上搜索了一下,无法找到合适的搜索结果。

我有一个 table 看起来像这样:

col_a, col_b
    a,     1,
    a,     2,
    a,     3,
    b,     1,
    b,     2,
    c,     1,

我需要使用生成随机代码值的函数更新 col_a 中的值,但是 'a' 的所有值都需要更新为相同的值,[=19= 也是如此] 等。有没有系统的方法可以做到这一点,除了:

UPDATE tbl SET col_a = make_code() WHERE col_a = 'a';
UPDATE tbl SET col_a = make_code() WHERE col_a = 'b'; ...

如果 make_code() 确实像 random() 一样工作,多个 update 语句不能保证每个 update 语句的代码相同。

您需要在真正更新发生之前计算一个代码(对于每个 distinct 个原始代码)。您可以使用子查询或(更具可读性)a CTE:

with codes as (
  select distinct on (col_a)
         col_a original_code,
         make_code() generated_code
  from   tbl
)
update tbl
set    col_a = generated_code
from   codes
where  col_a = original_code;

SQLFiddle