Esto ya se ha pedido en Stack Overflow , pero solo para MySQL. Estoy usando PostgreSQL. Desafortunadamente (y sorprendentemente) PostgreSQL no parece tener algo así CHECKSUM table
.
Una solución PostgreSQL estaría bien, pero una solución genérica sería mejor. Encontré http://www.besttechtools.com/articles/article/sql-query-to-check-two-tables-have-identical-data , pero no entiendo la lógica utilizada.
Antecedentes: reescribí un código generador de base de datos, por lo que necesito verificar si el código antiguo y el nuevo producen resultados idénticos.
postgresql
duplication
Faheem Mitha
fuente
fuente
EXCEPT
, verifique esta pregunta: Una forma eficiente de comparar dos grandes conjuntos de datos en SQLRespuestas:
Una opción es utilizar una UNIÓN COMPLETA EXTERIOR entre las dos tablas en el siguiente formulario:
Por ejemplo:
Devolverá una cuenta de 2, mientras que:
devuelve el esperado conteo de 0.
Lo que me gusta de este método es que solo necesita leer cada tabla una vez versus leer cada tabla dos veces cuando se usa EXISTS. Además, esto debería funcionar para cualquier base de datos que admita uniones externas completas (no solo Postgresql).
Generalmente desaconsejo el uso de la cláusula USING, pero aquí hay una situación en la que creo que es el mejor enfoque.
Anexo 2019-05-03:
Si hay un problema con los posibles datos nulos (es decir, la columna de identificación no es anulable pero el valor sí lo es), puede intentar lo siguiente:
fuente
Puedes usar el
EXCEPT
operador. Por ejemplo, si las tablas tienen una estructura idéntica, lo siguiente devolverá todas las filas que están en una tabla pero no en la otra (entonces 0 filas si las tablas tienen datos idénticos):O con
EXISTS
para devolver solo un valor booleano o una cadena con uno de los 2 resultados posibles:Probado en SQLfiddle
Tampoco el que
EXCEPT
elimina duplicados (eso no debería ser una preocupación si sus tablas tienen algunas restriccionesPRIMARY KEY
oUNIQUE
restricciones, pero puede serlo si está comparando resultados de consultas arbitrarias que potencialmente pueden producir filas duplicadas).Otra cosa que
EXCEPT
hace la palabra clave es que trata losNULL
valores como idénticos, por lo que si la tablaA
tiene una fila con(1,2,NULL)
y la tablaB
tiene una fila con(1,2,NULL)
, la primera consulta no mostrará estas filas y la segunda consulta devolverá'same'
si las dos tablas no tienen otra fila.Si desea contar tales filas como diferentes, puede usar una variación en la
FULL JOIN
respuesta de gsiems para obtener todas las filas (diferentes):y para obtener una respuesta sí / no:
Si todas las columnas de las dos tablas no son anulables, los dos enfoques darán respuestas idénticas.
fuente
SELECT <column_list> FROM a
lugar deTABLE a
EXCEPT
consulta es una belleza!Necesitas Excepto cláusula Algo así
Esto devuelve todas las filas de la primera tabla que no están en la segunda tabla
fuente
Mirando el código vinculado que no entiendes:
La salsa secreta se utiliza
union
en lugar deunion all
. El primero conserva solo filas distintas, mientras que el segundo conserva duplicados ( referencia ). En otras palabras, las consultas anidadas dicen "dame todas las filas y columnas de EmpDtl1 y, además, las de EmpDtl2 que aún no están en EmpDtl1". El recuento de esta subconsulta será igual al recuento de EmpDtl1 si y solo si EmpDtl2 no contribuye con ninguna fila al resultado, es decir, las dos tablas son idénticas.Alternativamente, volcar las tablas en secuencia de teclas en dos archivos de texto y usar su herramienta de comparación de elección.
fuente
EmpDtl2
tenga menos filasEmpDtl1
y todas las filas existentes existanEmpDtl1
.