Cela a déjà été demandé sur Stack Overflow , mais uniquement pour MySQL. J'utilise PostgreSQL. Malheureusement (et de manière surprenante) PostgreSQL ne semble pas avoir quelque chose comme ça CHECKSUM table
.
Une solution PostgreSQL serait bien, mais une solution générique serait mieux. J'ai trouvé http://www.besttechtools.com/articles/article/sql-query-to-check-two-tables-have-identical-data , mais je ne comprends pas la logique utilisée.
Contexte: J'ai réécrit du code de génération de base de données, je dois donc vérifier si l'ancien et le nouveau code produisent des résultats identiques.
postgresql
duplication
Faheem Mitha
la source
la source
EXCEPT
, vérifiez cette question: Un moyen efficace de comparer deux grands ensembles de données dans SQLRéponses:
Une option consiste à utiliser une FULL OUTER JOIN entre les deux tables sous la forme suivante:
Par exemple:
Renvoie un nombre de 2, alors que:
renvoie le nombre espéré de 0.
Ce que j'aime dans cette méthode, c'est qu'elle n'a besoin de lire chaque table qu'une seule fois que de lire chaque table deux fois lorsque vous utilisez EXISTS. De plus, cela devrait fonctionner pour toute base de données qui prend en charge les jointures externes complètes (pas seulement Postgresql).
Je décourage généralement l'utilisation de la clause USING, mais voici une situation où je pense que c'est la meilleure approche.
Addendum 2019-05-03:
S'il y a un problème avec des données nulles possibles (c'est-à-dire que la colonne id n'est pas nullable mais que la valeur l'est), vous pouvez essayer ce qui suit:
la source
Vous pouvez utiliser l'
EXCEPT
opérateur. Par exemple, si les tables ont une structure identique, ce qui suit renverra toutes les lignes qui se trouvent dans une table mais pas l'autre (donc 0 ligne si les tables ont des données identiques):Ou avec
EXISTS
pour ne renvoyer qu'une valeur booléenne ou une chaîne avec l'un des 2 résultats possibles:Testé chez SQLfiddle
Ce n'est pas non plus le qui
EXCEPT
supprime les doublons (cela ne devrait pas être un problème si vos tables en ontPRIMARY KEY
ou uneUNIQUE
contrainte, mais cela peut être si vous comparez les résultats de requêtes arbitraires qui peuvent potentiellement produire des lignes en double).Une autre chose que fait le
EXCEPT
mot - clé est qu'il traite lesNULL
valeurs comme identiques, donc si la tableA
a une ligne avec(1,2,NULL)
et la tableB
a une ligne avec(1,2,NULL)
, la première requête n'affichera pas ces lignes et la deuxième requête retournera'same'
si les deux tables n'ont pas d'autre ligne.Si vous voulez compter ces lignes comme différentes, vous pouvez utiliser une variation de la
FULL JOIN
réponse de gsiems , pour obtenir toutes les lignes (différentes):et pour obtenir une réponse oui / non:
Si toutes les colonnes des deux tables ne peuvent pas être annulées, les deux approches donneront des réponses identiques.
la source
SELECT <column_list> FROM a
place deTABLE a
EXCEPT
requête est magnifique!Vous avez besoin de la clause Except Quelque chose comme
Cela retourne toutes les lignes de la première table qui ne sont pas dans la deuxième table
la source
En regardant le code lié que vous ne comprenez pas:
La sauce secrète utilise
union
par opposition àunion all
. La première ne conserve que des lignes distinctes tandis que la seconde conserve des doublons ( référence ). En d'autres termes, les requêtes imbriquées indiquent "donnez-moi toutes les lignes et colonnes d'EmpDtl1 et en plus celles d'EmpDtl2 qui ne sont pas déjà dans EmpDtl1". Le nombre de cette sous-requête sera égal au nombre d'EmpDtl1 si et seulement si EmpDtl2 ne contribue aucune ligne au résultat, c'est-à-dire que les deux tables sont identiques.Vous pouvez également vider les tableaux dans l'ordre des touches dans deux fichiers texte et utiliser l'outil de comparaison de votre choix.
la source
EmpDtl2
est inférieur àEmpDtl1
et que toutes les lignes existantes existent dansEmpDtl1
.