Il solito modo in cui faccio queste cose in pg è:caricare i dati grezzi corrispondenti alla tabella di destinazione nella tabella temporanea (nessun vincolo) usando copia, unione (la parte divertente), profitto.
Ho scritto una funzione merge_by_key specificatamente per queste situazioni:
http://mbk.projects.postgresql.org/
I documenti non sono molto amichevoli, ma suggerirei di dargli un bene guarda.