postgresql 我希望在SQL中将temp_table中的所有列值upsert到master_table中

h9vpoimq  于 2023-03-12  发布在  PostgreSQL
关注(0)|答案(2)|浏览(134)

主表:
| _标识符|邮政编码|
| - ------|- ------|
| 一百二十三|一百|
| 四百五十六|二百|
临时表:
| _标识符|邮政编码|
| - ------|- ------|
| 一百二十三|一百一十一|
| 二百四十五|二百二十二|
master_table(必须在master_table中插入新结果)
| _标识符|邮政编码|
| - ------|- ------|
| 一百二十三|一百一十一|
| 四百五十六|二百|
我的最终目标是将记录从temp_table插入到master_table,并更新在temp_table中找到的master_table中的现有记录。
我刚刚给出了一个示例表,它不仅仅是邮政编码列需要更新。有许多这样的列(20+),所有这些都需要更新。只是为了说明:两个表具有相同的列数。

plicqrtu

plicqrtu1#

使用更新联接:

UPDATE master_table AS m
SET zipcode = t.zipcode
FROM temp_table t
WHERE m._id = t._id
piztneat

piztneat2#

您可以使用WITH来获取只需要更新的数据。
此方法允许您开发和测试选择查询,并通过两个步骤将其转换为更新查询。

with t as (
  select m._id, t.zipcode as new_zipcode
  from master_table m
  inner join temp_table as t on t._id = m._id and t.zipcode <> m.zipcode
)
update master_table m
set zipcode = t.new_zipcode
from t
where m._id = t._id

Demo here
要更新多列,只需将它们添加到inner join中,当然还要将它们添加到SET子句中:

with t as (
  select m._id, t.zipcode, t.column2
  from master_table m
  inner join temp_table as t on t._id = m._id and ( t.zipcode <> m.zipcode or t.column2 <> m.column2)
)
update master_table m
set zipcode = t.zipcode, column2 = t.column2
from t
where m._id = t._id

Demo here

相关问题