PostgreSQL:如何同步table1与table2同product的timestamp_local字段?
问题分析与解决方案
现有表数据
table1
| 产品(product) | 数量(amount) | timestamp_local |
|---|---|---|
| Prdct_1 | 100 | 2022-03-15 |
| Prdct_2 | 50 | |
| Prdct_3 | 40 | 2023-05-05 |
table2
| 产品(product) | 数量(amount) | timestamp_local |
|---|---|---|
| Prdct_1 | 100 | |
| Prdct_2 | 50 | 2021-12-30 |
| Prdct_3 | 40 |
原SQL的问题
- 两张表均未定义
id字段,使用id = b.id会触发字段不存在的错误,应使用唯一标识字段product进行关联。 - 需求是更新table2中已有产品的timestamp_local,而非插入新行,原SQL使用
insert语句不符合需求逻辑。
正确解决方案
根据需求,需要将table1中存在有效timestamp_local的记录同步到table2对应产品中,同时保留table2中已有的有效数据(比如Prdct_2的2021-12-30),可以使用UPDATE结合JOIN实现:
UPDATE table2 t2 JOIN table1 t1 ON t2.product = t1.product SET t2.timestamp_local = t1.timestamp_local WHERE t1.timestamp_local IS NOT NULL AND (t2.timestamp_local IS NULL OR t2.timestamp_local != t1.timestamp_local);
逻辑说明
- 通过
product字段关联两张表,确保更新的是对应产品的记录。 - 仅当table1的
timestamp_local非空,且table2的对应值为空或不一致时才执行更新,避免不必要的修改。 - 保留table2中已有的有效timestamp(如Prdct_2的2021-12-30不会被table1的空值覆盖)。
如果你的数据库不支持UPDATE JOIN语法,可以使用子查询方式:
UPDATE table2 t2 SET t2.timestamp_local = ( SELECT t1.timestamp_local FROM table1 t1 WHERE t1.product = t2.product ) WHERE EXISTS ( SELECT 1 FROM table1 t1 WHERE t1.product = t2.product AND t1.timestamp_local IS NOT NULL AND (t2.timestamp_local IS NULL OR t2.timestamp_local != t1.timestamp_local) );
内容的提问来源于stack exchange,提问作者anewone
相关产品推荐
相关产品推荐

