Dies wurde bereits bei Stack Overflow abgefragt , jedoch nur für MySQL. Ich benutze PostgreSQL. Leider (und überraschenderweise) scheint PostgreSQL so etwas nicht zu haben CHECKSUM table
.
Eine PostgreSQL-Lösung wäre in Ordnung, aber eine generische wäre besser. Ich habe http://www.besttechtools.com/articles/article/sql-query-to-check-two-tables-have-identical-data gefunden , aber ich verstehe die verwendete Logik nicht.
Hintergrund: Ich habe einige datenbankgenerierende Codes neu geschrieben, daher muss ich prüfen, ob der alte und der neue Code identische Ergebnisse liefern.
postgresql
duplication
Faheem Mitha
quelle
quelle
EXCEPT
Antworten:
Eine Möglichkeit besteht darin, einen FULL OUTER JOIN zwischen den beiden Tabellen in der folgenden Form zu verwenden:
Beispielsweise:
Gibt eine Anzahl von 2 zurück, wobei:
gibt die erhoffte Anzahl von 0 zurück.
Das, was ich an dieser Methode mag, ist, dass sie bei Verwendung von EXISTS jede Tabelle nur einmal und jede Tabelle nur zweimal lesen muss. Darüber hinaus sollte dies für jede Datenbank funktionieren, die vollständige äußere Verknüpfungen unterstützt (nicht nur Postgresql).
Ich rate generell von der Verwendung der USING-Klausel ab, aber hier ist eine Situation, in der ich glaube, dass dies der bessere Ansatz ist.
Nachtrag 2019-05-03:
Wenn es ein Problem mit möglichen Nulldaten gibt (dh die ID-Spalte ist nicht nullfähig, der Wert jedoch), können Sie Folgendes versuchen:
quelle
Sie können den
EXCEPT
Operator verwenden. Wenn die Tabellen beispielsweise eine identische Struktur haben, werden im Folgenden alle Zeilen zurückgegeben, die sich in einer Tabelle, jedoch nicht in der anderen befinden (also 0 Zeilen, wenn die Tabellen identische Daten enthalten):Oder mit
EXISTS
, um nur einen Booleschen Wert oder eine Zeichenfolge mit einem der beiden möglichen Ergebnisse zurückzugeben:Getestet bei SQLfiddle
Auch nicht die,
EXCEPT
die Duplikate entfernt (das sollte keine Sorge sein, wenn Ihre Tabellen einigePRIMARY KEY
oder habenUNIQUE
Einschränkungen haben, aber es kann sein, wenn Sie Ergebnisse von willkürlichen Abfragen vergleichen, die möglicherweise doppelte Zeilen erzeugen können).Das
EXCEPT
Schlüsselwort behandeltNULL
Werte als identisch. Wenn also eine TabelleA
eine Zeile mit(1,2,NULL)
und eine TabelleB
eine Zeile mit enthält(1,2,NULL)
, werden diese Zeilen in der ersten Abfrage nicht angezeigt, und die zweite Abfrage wird zurückgegeben,'same'
wenn die beiden Tabellen keine andere Zeile enthalten.Wenn Sie solche Zeilen als unterschiedlich zählen möchten, können Sie eine Variation der
FULL JOIN
Antwort von gsiems verwenden , um alle (verschiedenen) Zeilen abzurufen :und um eine Ja / Nein-Antwort zu erhalten:
Wenn nicht alle Spalten der beiden Tabellen nullwertfähig sind, geben die beiden Ansätze identische Antworten.
quelle
SELECT <column_list> FROM a
stattTABLE a
EXCEPT
Abfrage ist eine schöne!Du brauchst so etwas wie Except Klausel
Dadurch werden alle Zeilen aus der ersten Tabelle zurückgegeben, die nicht in der zweiten Tabelle enthalten sind
quelle
Wenn Sie den verknüpften Code betrachten, verstehen Sie nicht:
Die geheime Sauce wird
union
im Gegensatz dazu verwendetunion all
. Ersteres behält nur einzelne Zeilen bei, während letzteres Duplikate ( Verweise ) enthält. Mit anderen Worten, die verschachtelten Abfragen sagen "gib mir alle Zeilen und Spalten von EmpDtl1 und zusätzlich die von EmpDtl2, die noch nicht in EmpDtl1 sind". Die Anzahl dieser Unterabfrage entspricht genau dann der Anzahl von EmpDtl1, wenn EmpDtl2 keine Zeilen zum Ergebnis beiträgt, dh die beiden Tabellen identisch sind.Alternativ können Sie die Tabellen in Schlüsselsequenz in zwei Textdateien ablegen und das Vergleichstool Ihrer Wahl verwenden.
quelle
EmpDtl2
hat weniger Zeilen alsEmpDtl1
und alle vorhandenen Zeilen existieren inEmpDtl1
.