Ich habe 2 Tabellen TableA
und TableB
die haben das gleiche Format der Spalte zum Beispiel beide Tabellen TableA
und TableB
Spalten
A B C D E F
wobei A und B die Primärschlüssel sind.
So schreiben Sie SQL, um zu überprüfen, ob TableA
und TableB
mit denselben Primärschlüsseln in jeder Spalte genau der gleiche Wert enthalten ist.
Dies bedeutet, dass diese beiden Tabellen genau dieselben Daten enthalten.
tableA
zusätzliche Zeilen vorhanden sind. Sie würden brauchen,(A EXCEPT B) INTERSECT (B EXCEPT A)
ich würde vermuten, dass dies viel weniger effizient wäre als ein Moor-Standard-Join.Verwenden von Vergleichsoperatoren:
Wechseln Sie
EXCEPT
zuMINUS
für Oracle.Etwas wählerischer Punkt: Das Obige hängt von der Priorität des Operators ab, die laut SQL-Standard implementierungsabhängig ist, also YMMV. Es funktioniert für SQL Server, für die folgende Priorität besteht:
INTERSECT
EXCEPT
undUNION
von links nach rechts ausgewertet.quelle
Dietbuddha hat eine schöne Antwort. In Fällen, in denen Sie kein MINUS oder EXCEPT haben, besteht eine Option darin, alle Verbindungen zwischen den Tabellen herzustellen, mit allen Spalten zu gruppieren und sicherzustellen, dass zwei von allem vorhanden sind:
quelle
DISTINCT
/GROUP BY
für die Unterabfragen in der Union vorgeschlagen, um sicherzustellen, dass nur ein Datensatz pro Tabelle vorhanden ist. Andernfalls könnte Tabelle A 2 Datensätze haben und Tabelle B könnte 0 haben und die HAVING-Bedingung nicht erfüllen.Gibt alle IDs zurück, die in beiden Tabellen die GLEICHEN sind. Um die Unterschiede zu erhalten, ändern Sie EXISTS in NOT EXISTS.
quelle
Ich habe das Skript von einem Tag an geändert, um auch zu zeigen, aus welcher Tabelle jeder Eintrag stammt.
quelle
Um den Vorgang abzuschließen, muss ein Prozess, der mit der Ausnahme-Methode gespeichert wurde, um 2 Tabellen zu vergleichen und das Ergebnis in derselben Tabelle mit 3 Fehlerstatus zu liefern. ADD, DEL, GAP-Tabelle muss dieselbe PK haben. Sie deklarieren die 2 zu vergleichenden Tabellen und Felder von 1 oder beiden Tabellen
Verwenden Sie einfach wie folgt ps_TableGap 'tbl1', 'Tbl2', 'fld1, fld2, fld3', 'fld4'fld5'fld6' (optional)
quelle
Verbesserung der Antwort von Dietbuddha ...
quelle
Sie können Unterschiede von 2 Tabellen mithilfe der Kombination aus Einfügen aller und vollständiger äußerer Verknüpfung in Oracle feststellen. In SQL können Sie die Unterschiede über eine vollständige äußere Verknüpfung extrahieren, aber es scheint, dass das Einfügen von all / first in SQL nicht vorhanden ist! Daher müssen Sie stattdessen die folgende Abfrage verwenden:
Obwohl die Verwendung von 'OR' in der where-Klausel nicht empfohlen wird und normalerweise zu einer geringeren Leistung führt, können Sie die obige Abfrage dennoch verwenden, wenn Ihre Tabellen nicht massiv sind. Wenn es ein Ergebnis für die obige Abfrage gibt, sind es genau die Unterschiede von 2 Tabellen basierend auf dem Vergleich der Felder 1,2,3,4. Um die Abfrageleistung zu verbessern, können Sie sie auch nach Datum filtern (überprüfen Sie den kommentierten Teil).
quelle
Quelle: Verwenden Sie NATURAL FULL JOIN, um zwei Tabellen in SQL von Lukas Eder zu vergleichen
Cleverer Ansatz
NATURAL FULL JOIN
zur Erkennung derselben / unterschiedlicher Zeilen zwischen zwei Tabellen.Beispiel 1 - Statusflag:
Beispiel 2 - Zeilen filtern
db <> Geigen-Demo
quelle
Ergebnis ist null, aber die Quellen sind unterschiedlich!
Aber:
funktioniert.
quelle
Ich hatte das gleiche Problem in SQL Server und schrieb dieses T-SQL-Skript, um den Prozess zu automatisieren (tatsächlich ist dies die verwässerte Version, meine hat alle Unterschiede für eine einfache Berichterstellung in eine einzige Tabelle geschrieben).
Aktualisieren Sie 'MyTable' und 'MyOtherTable' auf die Namen der Tabellen, die Sie vergleichen möchten.
quelle
Ich habe dies geschrieben, um die Ergebnisse einer ziemlich unangenehmen Ansicht zu vergleichen, die ich von Oracle auf SQL Server portiert habe. Es werden zwei temporäre Tabellen, #DataVariances und #SchemaVariances, erstellt, mit Unterschieden in (Sie haben es erraten) den Daten in den Tabellen und dem Schema der Tabellen selbst.
Es erfordert, dass beide Tabellen einen Primärschlüssel haben, aber Sie können ihn mit einer Identitätsspalte in tempdb ablegen, wenn die Quelltabellen keinen haben.
quelle
Die meisten Antworten scheinen das von Kamil aufgeworfene Problem zu ignorieren. (Dort enthalten die Tabellen identische Zeilen, aber in jeder Tabelle werden unterschiedliche Zeilen wiederholt.) Leider kann ich seine Lösung nicht verwenden, da ich in Oracle bin. Das Beste, was ich mir einfallen lassen konnte, ist:
quelle
Zum Vergleich von T1 (PK, A, B) und T2 (PK, A, B).
Vergleichen Sie zuerst die Primärschlüsselsätze, um auf beiden Seiten nach fehlenden Schlüsselwerten zu suchen:
Listen Sie dann alle Wertinkongruenzen auf:
A und B müssen vom gleichen Typ sein. Sie können das INFORMATIONSSCHEMA verwenden, um das SELECT zu generieren. Vergessen Sie nicht, dass COALESCE auch IS NULL-Ergebnisse enthält. Sie können auch FULL OUTER JOIN und COALESCE (T1.PK, 0) = COALESCE (T2.PK, 0) verwenden.
Zum Beispiel für Spalten vom Typ varchar:
quelle
Wir können Daten aus zwei Tabellen von DB2-Tabellen mit der folgenden einfachen Abfrage vergleichen:
Schritt 1: - Wählen Sie aus der Tabelle (T1) des Schemas (S) aus, welche Spalten wir vergleichen möchten.
Schritt 2: - Verwenden Sie das Schlüsselwort 'Minus' zum Vergleichen von 2 Tabellen.
Schritt 3: - Wählen Sie aus der Tabelle (T2) des Schemas (S) aus, welche Spalten wir vergleichen möchten.
Endresultat:
Wenn die Abfrage keine Zeilen zurückgibt, sind die Daten genau gleich.
quelle
In MySQL, wo "Minus" nicht unterstützt wird und die Leistung berücksichtigt wird, ist dies schnell
quelle
Eine alternative, erweiterte Abfrage basierend auf der Antwort von dietbuddha & IanMc. Die Abfrage enthält eine Beschreibung, um zu zeigen, wo Zeilen vorhanden sind und fehlen. (Hinweis: für SQL Server )
quelle
'X' ist ein beliebiger Wert.
Wechseln Sie die Tabellen, um die verschiedenen Abweichungen anzuzeigen.
Stellen Sie sicher, dass Sie die Schlüsselfelder in Ihren Tabellen verbinden.
Oder verwenden Sie einfach den MINUS-Operator mit 2 select-Anweisungen. MINUS kann jedoch nur in Oracle arbeiten.
quelle