首页 > 解决方案 > 我如何在 Postgres 中更新除一行之外的所有行

问题描述

我有桌子:-

|   num   | name     |  value |
----------------------------------
|    1    | name1    |   1    |
|    2    | name2    |   1    |
|    1    | name1    |   1    |
|    4    | name4    |   2    |
|    1    | name1    |   3    |

我想用 5 更新每个值列,除了列 num 和 name 都相同的一行

就像我试过如果有人纠正它

UPDATE table t 
            SET
            value = 5
            FROM table  t2
            WHERE
            t1.num = t2.num AND
            t1.name = t2.name 

但它更新了所有行我希望单行(任何人)不更新

标签: sqlpostgresql

解决方案


使用row_number()

UPDATE table t 
    SET value = 5
    FROM (SELECT t2.*, ROW_NUMBER() OVER (PARTITION BY num, name ORDER BY num) as seqnum
          FROM table t2
         ) t2
    WHERE t.num = t2.num AND
          t.name = t2.name AND
          t2.seqnum > 1;

推荐阅读