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;
id | código | importe |
1 | 34D7100G71 | 40 |
2 | 87001JT56L | 56 |
3 | 22HE780M1C | 23 |
4 | 74E00P76N1 | 230 |
postgres=# select * from pedidos_2;
id | código | importe |
1 | 34D7100G71 | 100 |
2 | 87001JT56L | 56 |
3 | 22HE780M1C | 23 |
4 | A987GT234E | 150 |
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ódigo | código |
34D7100G71 | 34D7100G71 |
87001JT56L | 87001JT56L |
22HE780M1C | 22HE780M1C |
Podemos comprobar si los importes de cada pedido han variado:
importe | importe |
40 | 100 |
56 | 56 |
23 | 23 |
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;
pedidos | pedidos_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.