用同一表中的值更新行[英] UPDATE rows with values from the same table

本文是小编为大家收集整理的关于用同一表中的值更新行的处理方法,想解了用同一表中的值更新行的问题怎么解决?用同一表中的值更新行问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一张这样的桌子:

+------+-------+
|ID    | value |
+------+-------+
| 1    | 150   |
| 2    |       |
| 3    |       |
| 4    |       |
| 5    | 530   |
| 6    | 950   |
| 7    | 651   |
+-------+------+

我想复制最后 3 个值,最后我的表格将如下所示:

+------+-------+
|ID    | value |
+------+-------+
| 1    | 150   |
| 2    | 530   |
| 3    | 950   |
| 4    | 651   |
| 5    | 530   |
| 6    | 950   |
| 7    | 651   |
+-------+------+

有可能吗?

推荐答案

使用自加入:

UPDATE mytable m
SET    value = m0.value
FROM   mytable m0
WHERE  m.id = (m0.id - 3)   -- define offset
AND    m.id BETWEEN 2 AND 4 -- define range to be affected
AND    m.value IS NULL;     -- make sure only NULL values are updated

如果ID 空间中存在间隙,请使用windows 函数row_number() 获取可使用的无间隙ID.我在 CTE 中这样做,因为我将重复使用该表两次以进行自联接:

WITH x AS (
   SELECT *, row_number() OVER (ORDER BY ID) AS rn
   FROM   mytable
   )
UPDATE mytable m
SET    value = y.value
FROM   x
JOIN   x AS y ON x.rn = (y.rn - 4567)   -- JOIN CTE x AS y with an offset
WHERE  x.id = m.id                      -- JOIN CTE x to original
AND    m.id BETWEEN 1235 AND 3455
AND    m.value IS NULL;

数据需要 PostgreSQL 9.1 或更高版本- 修改 CTEs.

本文地址:https://www.itbaoku.cn/post/1764207.html