2016-10-12 6 views
0

Ниже приведена моя сценарий:Потребление изменений/дельта с использованием Postgresql

У меня есть 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

@a_horse_with_no_name Готово! – vin4yak

ответ

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() и явно удалить обновление столбца имен.