La forma habitual en que hago estas cosas en pg es:cargar la tabla de destino de coincidencia de datos sin procesar en la tabla temporal (sin restricciones) usando copiar, fusionar (la parte divertida), obtener ganancias.
Escribí una función merge_by_key específicamente para estas situaciones:
http://mbk.projects.postgresql.org/
Los documentos no son terriblemente amigables, pero sugeriría darle una buena mira.