Ich versuche, zwei Tabellen, SQL Server, zu vergleichen, um einige Daten zu überprüfen. Ich möchte alle Zeilen aus beiden Tabellen zurückgeben, in denen sich Daten entweder in der einen oder in der anderen befinden. Im Wesentlichen möchte ich alle Diskrepanzen zeigen. Ich muss dabei drei Daten überprüfen: Vorname, Nachname und Produkt.
Ich bin ziemlich neu in SQL und es scheint, dass viele der Lösungen, die ich finde, die Dinge komplizieren. Ich muss mir keine Sorgen um NULL machen.
Ich habe zunächst so etwas versucht:
SELECT DISTINCT [First Name], [Last Name], [Product Name] FROM [Temp Test Data]
WHERE ([First Name] NOT IN (SELECT [First Name]
FROM [Real Data]))
Ich habe jedoch Probleme, dies weiterzuentwickeln.
Vielen Dank!
BEARBEITEN:
Basierend auf der Antwort von @treaschf habe ich versucht, eine Variation der folgenden Abfrage zu verwenden:
SELECT td.[First Name], td.[Last Name], td.[Product Name]
FROM [Temp Test Data] td FULL OUTER JOIN [Data] AS d
ON td.[First Name] = d.[First Name] AND td.[Last Name] = d.[Last Name]
WHERE (d.[First Name] = NULL) AND (d.[Last Name] = NULL)
Aber ich bekomme immer wieder 0 Ergebnisse zurück, wenn ich weiß, dass es mindestens 1 Zeile in td gibt, die nicht in d ist.
BEARBEITEN:
Ok, ich denke ich habe es herausgefunden. Zumindest in meinen wenigen Minuten des Testens scheint es gut genug zu funktionieren.
SELECT [First Name], [Last Name]
FROM [Temp Test Data] AS td
WHERE (NOT EXISTS
(SELECT [First Name], [Last Name]
FROM [Data] AS d
WHERE ([First Name] = td.[First Name]) OR ([Last Name] = td.[Last Name])))
Dies wird mir im Grunde sagen, was in meinen Testdaten enthalten ist, was nicht in meinen realen Daten enthalten ist. Welches ist völlig in Ordnung für das, was ich tun muss.
Antworten:
WENN Sie Tabellen haben
A
undB
beide mit columC
, sind hier die Datensätze, die in der Tabelle vorhanden sind,A
aber nicht inB
:Um alle Unterschiede mit einer einzigen Abfrage zu ermitteln, muss ein vollständiger Join wie folgt verwendet werden:
Was Sie in diesem Fall wissen müssen, ist, dass, wenn ein Datensatz in
A
, aber nicht in gefunden werden kannB
, die Spalten, aus denen stammenB
, NULL sind, und in ähnlicher Weise für diejenigen, die inB
und nicht inA
den Spalten vonA
will vorhanden sind null sein.quelle
The objects "a.dbo.student" and "b.dbo.student" in the FROM clause have the same exposed names. Use correlation names to distinguish them.
Ich erhalte eine Fehlermeldung, wenn die Tabellennamen identisch sind und Sie sie aus zwei verschiedenen Datenbanken abrufen.a.dbo.student as
undb.dbo.student bs
dann auf Tabellen mitas
und verweisenbs
quelle
SELECT *
funktioniert, wenn dies für alle Spalten der Fall ist; Wenn nicht, wählen Sie einfach eine Teilmenge aus.Ich weiß, dass dies möglicherweise keine beliebte Antwort ist, aber ich stimme @Randy Minder darin zu, Tools von Drittanbietern zu verwenden, wenn komplexere Vergleiche erforderlich sind.
Dieser spezielle Fall ist hier einfach und für diesen Fall werden solche Tools nicht benötigt. Dies kann jedoch leicht komplex werden, wenn Sie mehr Spalten, Datenbanken auf zwei Servern, komplexere Vergleichskriterien usw. einführen.
Es gibt viele dieser Tools wie ApexSQL Data Diff oder Quest Toad, und Sie können sie jederzeit im Testmodus verwenden, um die Aufgabe zu erledigen.
quelle
tablediff
Befehlszeilenprogramm, auf das hier Bezug genommen wird .Um alle Unterschiede zwischen zwei Tabellen zu erhalten, können Sie wie ich diese SQL-Anfrage verwenden:
quelle
Einfache Variation der @ erikkallen-Antwort, die zeigt, in welcher Tabelle die Zeile vorhanden ist:
Wenn Sie eine Fehlermeldung erhalten
dann kann es helfen, hinzuzufügen
quelle
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
bei dieser Auswahl. Ich musste das'table1' as source,
Teil auch zum Except-Teil hinzufügen . - Ich habe die Antwort darauf bearbeitet.Wenn Sie herausfinden möchten, welche Spaltenwerte unterschiedlich sind, können Sie das Entity-Attribute-Value-Modell verwenden:
SQL FIDDLE BEISPIEL
quelle
Versuche dies :
Viel einfacher zu lesen.
quelle
Dies wird den Trick machen, ähnlich wie bei Tiagos Lösung, auch die "Quell" -Tabelle zurückzugeben.
Das Ergebnis enthält Unterschiede zwischen den Tabellen. In der Spalte _tabloc finden Sie eine Tabellenreferenz.
quelle
Präsentation des Cadillac of Diffs als SP. Unten finden Sie die grundlegende Vorlage, die auf der Antwort von @erikkallen basiert. Es unterstützt
Verwendung:
Code:
quelle
Sie können zum Beispiel Folgendes verwenden:
quelle
Für einen einfachen Rauchtest, bei dem Sie sicherstellen möchten, dass zwei Tabellen übereinstimmen, ohne sich Gedanken über Spaltennamen zu machen:
Sie können einfach eine Speicherprozedur schreiben, um einen Stapel von Tabellen zu vergleichen.
quelle
Es gibt ein Leistungsproblem im Zusammenhang mit dem linken Join sowie dem vollständigen Join mit großen Datenmengen.
Meiner Meinung nach ist dies die beste Lösung:
quelle