Cómo obtener las diferencias entre dos tablas en PostgreSQL

A menudo sucede que queremos comparar dos tablas que, a priori deberían de tener el mismo contenido, pero que sabemos que no es así por cualquier motivo.

Un buen ejemplo en el que esto ocurre es cuando tenemos una tabla que almacena un callejero de nuestra provincia y nos envían una revisión actualizada.

Lo más probable que hagamos será cargar el fichero con el nuevo callejero en una tabla temporal y, de alguna manera, actualizar nuestra tabla.

Podría ser que nos sirva sólo con sustituir una tabla por la otra pero no es lo común ya que las claves primarias podrían no coincidir, o quizás en nuestra tabla tengamos unas columnas con información procedente de otras fuentes que no viene en el nuevo callejero, etc. etc.

En este caso no nos queda más remedio que comparar las dos tablas, ver las diferencias y tomar acciones.

En este artículo explico cómo hacerlo de una forma sencilla y óptima.

Para entenderlo lo primero es saber que en PostgreSQL se puede hacer esto:

select mytable from mytable;

que devuelve todas las columnas de un registro como si fueran un único valor.

Esto da mucho juego.. vamos a verlo con un ejemplo sencillo.

Observa estas tablas:

postgres=# select * from pedidos;

 

idcódigoimporte
134D7100G7140
287001JT56L56
322HE780M1C23
474E00P76N1230

postgres=# select * from pedidos_2;

idcódigoimporte
134D7100G71100
287001JT56L56
322HE780M1C23
4A987GT234E150

Podemos comprobar si los ids se corresponden con los códigos:

postgres=# select pedidos.codigo, pedidos_2.codigo

postgres-# from pedidos inner join pedidos_2 on pedidos.id = pedidos_2.id;

códigocódigo
34D7100G7134D7100G71
87001JT56L87001JT56L
22HE780M1C22HE780M1C

Podemos comprobar si los importes de cada pedido han variado:

importeimporte
40100
5656
2323

Pero también podemos obtener todas las diferencias:

postgres=# select pedidos, pedidos2

from pedidos full join pedidos_2 on pedidos=pedidos_2

where pedidos is null or pedidos_2 is null;

pedidospedidos_2
(1,34D7100G71,40) 
 (1,34D7100G71,100)
 (4,A987GT234E,150)
(5,74E00P76N1,230 

Si se trata de actualizar la primera tabla con los datos de la segunda entonces, en ese ejemplo, tendríamos que eliminar los registros con id 1 y 5 de la primera tabla e insertar los registros con id 1 y 4 de la segunda.