En ocasiones necesitamos comparar dos tablas para encontrar registros en una tabla que no tengan registros coincidentes en la otra.
Seguramente nuestra base de datos nueva tenga un esquema diferente al de la base de datos heredada, y nos encargan transferir todos los datos de la base de datos heredada a la nueva, vamos a asegurarnos de que la transferencia sea exitosa.
Debemos comparar dos tablas, una de la base de datos heredada y otra de la nueva base de datos, y encontrar cualquier registro que no coincida.
Ejemplo: necesitamos comparar las columnas de dos tablas, tabla_1
y tabla_2
. Los siguientes pasos comparan dos tablas para encontrar los registros que no coinciden.
- Primero, una las filas de ambas tablas usando la instrucción
UNION
; incluya sólo las columnas necesarias. La comparación se realiza utilizando el conjunto de resultados devuelto.SELECT table_1.primary_key, table_1.column_1, table_1.column2 FROM table_1 UNION ALL SELECT table_2.primary_key, table_2.column_1, table_2.column2 FROM table_2;
- Luego, los registros deben agruparse de acuerdo con la clave principal y las columnas que requieren comparación. La función
CONTAR(*)
produce2
si los valores de las columnas que deben compararse son similares; en caso contrario, devuelve1
.SELECT primary_key, column_1, column_2 FROM ( SELECT table_1.primary_key, table_1.column_1 FROM table_1 UNION ALL SELECT table_2.primary_key, table_2.column_1 FROM table_2 ) temporary_table GROUP BY primary_key, column_1, column_2 HAVING COUNT(*) = 1 ORDER BY primary_key
El siguiente ejemplo te ayudara a comprender mejor la idea anterior.
SELECT empleado_id, departamento, email
FROM (
SELECT empleado_id, departamento, email FROM vieja_tabla_empleados
UNION ALL
SELECT empleado_id,departamento, email FROM nueva_tabla_empleados
) tabla_temporal
GROUP BY empleado_id, departamento, email
HAVING count(*) = 1
ORDER BY employee_id;
Con el ejemplo anterior comparamos las tablas de empleados antiguo y nuevo, y los resultados se almacenan en una tabla_temporal
. Después de la devolución del resultado, estamos agrupando por empleado_id
, nombre del departamento e ID de correo electrónico.
Si los valores de las columnas a comparar son idénticos, el método COUNT(*)
devuelve 2
; en caso contrario, devuelve 1
. Por lo tanto, usamos la cláusula HAVING
para verificar el valor único.
Finalmente, imprimimos el resultado en orden ascendente empleado_id
.
Ejecute la línea de código anterior en cualquier navegador compatible con MySQL. Mostrará el siguiente resultado:
+-------------+--------------------+----------------------+
| empleado_id | departamento | email |
+-------------+--------------------+----------------------+
| 14 | Marqueting | john_doe@example.com |
| 15 | TeleComunicaciones | johndoe@example.com |
+-------------+--------------------+----------------------+