Prüfen ob der Inhalt 2er Tabellen gleich ist

Bei der DWH Entwicklung kommt es häufig vor, dass im Zuge von Qualitätssicherungsprozessen überprüft werden muss, ob die neue Version eines ETL-Jobs, das gleiche Ergebnis liefert wie die alte Version.

Sprich ob nach einem ETL-Lauf, der Tabelleninhalt der neuen und der alten Dimensions- oder Faktentabelle identisch ist. Dies kann für 2 Tabellen auf der gleichen Datenbank, oder Datenbanken mit direkter Verbindung, über folgende Abfragen ermittelt werden.

1. Enthält die alte Tabelle Zeilen, die sich in der neuen nicht finden:

SELECT * FROM OLD_TABLE
EXCEPT
SELECT * FROM NEW_TABLE

liefert diese Abfrage keine Zeilen, sind alle alten Zeilen auch in der neuen Version enthalten.

2. Enthält die neue Tabelle Zeilen, die die alte Tabelle nicht enthielt:

SELECT * FROM NEW_TABLE
EXCEPT
SELECT * FROM OLD_TABLE

liefert diese Abfrage keine Zeilen, sind keine Zeilen der neuen Tabelle nicht in der alten enthalten. Haben die beiden Tabellen Schlüssel, ist man nun fertig. Kann/darf es auch doppelte Zeilen geben, sind folgende weiteren Schritte notwendig, da EXCEPT mit distinkten Zeilen arbeitet:

3. Enthalten beide Tabellen die gleiche Anzahl Zeilen:

SELECT count(*) FROM OLD_TABLE
EXCEPT
SELECT count(*) FROM NEW_TABLE

liefert diese Abfrage keine Zeilen, ist die Zeilenanzahl beider Tabellen identisch.

4. Sind die gleichen Zeilen doppelt:

Es könnte nun nur noch folgende Situation zu einer Abweichung führen, die in den ersten Tests nicht auffällt. Hier sind jeweils Zeilen doppelt, aber nicht die selben. Das heißt, es gibt keine Zeile in OLD_TABLE, die es so in NEW_TABLE nicht gäbe (Schritt 1), keine Zeile die es in NEW_TABLE gibt, aber nicht in OLD_TABLE (Schritt 2) und es sind gleich viele Zeilen in beiden Tabellen (Schritt 3):

OLD_TABLE:   NEW_TABLE:
COL_A COL_B
WERT 1 WERT 2
WERT 1 WERT 2
WERT 3 WERT 4
 
COL_A COL_B
WERT 1 WERT 2
WERT 3 WERT 4
WERT 3 WERT 4

Dies lässt sich durch folgende Abfrage abfangen:

SELECT COL_A, COL_B, count(*) FROM OLD_TABLE GROUP BY COL_A, COL_B
EXCEPT
SELECT COL_A, COL_B, count(*) FROM NEW_TABLE GROUP BY COL_A, COL_B

Diese Abfrage muss nicht mehr in beide Richtungen ausgeführt werden, da in Schritt 1 und 2 bereits verschiedene Zeilen ausgeschlossen wurden. Hinweis: ergänzt man die Abfragen 1 und 2 direkt mit count(*) und GROUP BY, kann der 4. Schritt entfallen.