以下是我的情景:
我有2个登陆表source_table和destination_table。
我需要一个查询/查询,它将使用新行以及源表中更新的行更新目标表。
示例数据将是:
source table:
id name salary
1 P1 10000
2 P2 20000
target table:
id name salary
1 P1 8000
预期的输出应为:
target table:
id name salary
1 P1 10000 (salary updated)
2 P2 20000 (new row inserted)
这似乎不起作用:
select * from user_source
except
select * from user_target as s
INSERT INTO user_target (id, name, salary)
VALUES (s.id, s.name, s.salary) WHERE id !=s.id
UPDATE user_target
SET name=s.name, salary=s.salary,
WHERE id = s.id
答案 0 :(得分:0)
对我来说似乎很简单insert ... on conflict
:
insert into target_table (id, name, salary)
select id, name, salary
from source_table
on conflict (id) do update
set name = excluded.name,
salary = excluded.salary;
这假定id
列是主要(或唯一)键。查看示例数据(id, name)
也可能是唯一的。在这种情况下,您需要更改on conflict()
子句,并且显然也会删除名称列的更新。