2016-10-12 1 views
0

Folgendes ist mein Szenario:Verbrauchen Sie die Änderungen/Deltas mit Postgresql

Ich habe 2 Landing-Tabellen source_table und destination_table.

Ich brauche eine Abfrage/Abfragen, die die Zieltabelle mit den neuen Zeilen sowie die aktualisierten Zeilen aus Quellentabelle aktualisiert.

Beispieldaten wäre:

source table: 
id name salary 
1  P1  10000 
2  P2  20000 

target table: 
id name salary 
1  P1  8000 

Und die erwartete Ausgabe sein sollte:

target table: 
id name salary 
1  P1  10000 (salary updated) 
2  P2  20000 (new row inserted) 

Dies scheint nicht zu funktionieren:

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 Fertig! – vin4yak

Antwort

0

wie ein einfaches insert ... on conflict Scheint zu mir:

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; 

Dies setzt voraus, dass die Spalte id der primäre (oder eindeutige) Schlüssel ist. Betrachten Sie die Beispieldaten (id, name) könnte auch einzigartig sein. In diesem Fall müssen Sie die on conflict()-Klausel ändern und natürlich auch das Update der Namensspalte entfernen.

Verwandte Themen