【发布时间】:2020-07-02 21:30:48
【问题描述】:
假设有一张数据表:
+----+-------+
| id | value |
+----+-------+
| 1 | 0 |
| 2 | 0 |
+----+-------+
我需要进行批量更新。并使用COPY FROM STDIN 快速插入临时表而不受约束,因此它可以在id 列中包含重复值
要更新的临时表:
+----+-------+
| id | value |
+----+-------+
| 1 | 1 |
| 2 | 1 |
| 1 | 2 |
| 2 | 2 |
+----+-------+
如果我简单地运行如下查询:
UPDATE test target SET value = source.value FROM tmp_test source WHERE target.id = source.id;
我得到了错误的结果:
+----+-------+
| id | value |
+----+-------+
| 1 | 1 |
| 2 | 1 |
+----+-------+
我需要目标表包含临时表中最后出现的值。
考虑到目标表可能包含数百万条记录,而临时表可能包含数万条记录,那么最有效的方法是什么?**
【问题讨论】:
-
请定义“最后一个”。除非由
ORDER BY定义,否则关系表中没有顺序。你的意思是最后插入,身体上? -
是的,临时表中的最后一个值是最后写入的值。在我的示例中,这是“2”
标签: postgresql sql-update greatest-n-per-group postgresql-performance postgresql-11