2016-04-20 12 views
1

Es gibt ein paar ähnliche Threads im Laufe der Jahre in Bezug auf diese, aber ich habe nicht gefunden oder war in der Lage zu tun, was ich suche.SQL Server: Auflisten von Unterschieden zwischen Tabellen

Ich habe derzeit zwei Tabellen, die dasselbe Schema haben, das ich durch ein Skript produziere. Einer ist "results_prior" und der andere ist "results_current". Diese neue Abfrage wird idealerweise einmal im Monat ausgeführt und ermittelt, ob es Unterschiede gibt. Beispiel:

TABLE: results_prior

---------------------------------------- 
| ID | ENVIRONMENT | EDITION | CONTACT | 
---------------------------------------- 
| 03 | Development | 2008 | Bob  | 
---------------------------------------- 
| 05 | Production | 2012 | Phil | 
---------------------------------------- 
| 09 | Development | 2008 | Erik | 
---------------------------------------- 
| 13 | Production | 2012 | Ashley | 
---------------------------------------- 
| 22 | Production | 2012 | Erik | 
---------------------------------------- 

TABLE: results_current

---------------------------------------- 
| ID | ENVIRONMENT | EDITION | CONTACT | 
---------------------------------------- 
| 03 | Development | 2008 | Bob  | 
---------------------------------------- 
| 05 | Production | 2012 | Phil | 
---------------------------------------- 
| 22 | Production | 2012 | Erik | 
---------------------------------------- 

Wenn die beiden miteinander verglichen werden, sollte das Ergebnis sein:

---------------------------------------- 
| ID | ENVIRONMENT | EDITION | CONTACT | 
---------------------------------------- 
| 09 | Development | 2008 | Erik | 
---------------------------------------- 
| 13 | Production | 2012 | Ashley | 
---------------------------------------- 

seit 09 und 13 wurden in results_current. Ebenso, und dies ist vielleicht der knifflige Teil, ist dasselbe zu tun, wenn result_current mehr Ergebnisse als results_prior hat. Also umgekehrt.

Entschuldigung, ich habe keinen Beispielcode, um davon zu gehen. Ich habe die letzten paar Stunden mit UNION, JOINs und EXCEPTs herumgespielt und ich habe das Gefühl, dass meine Logik (wiederum in SQL Server) keinen Sinn ergibt. Jede Hilfe wäre willkommen.

Antwort

0

ich etwas grob ähnlich wie diese versuchen würden:

SELECT ID, ENVIRONMENT, EDITION, CONTACT FROM RESULTS_PRIOR 
WHERE ID NOT IN (SELECT ID FROM RESULTS_CURRENT) 
UNION 
SELECT ID, ENVIRONMENT, EDITION, CONTACT FROM RESULTS_CURRENT 
WHERE ID NOT IN (SELECT ID FROM RESULTS_PRIOR) 
+0

ich etwas Ähnliches tun würde, aber ich würde ersetzen „ist nicht vorhanden“ für die „NOT IN“ -Klausel. NOT EXISTS funktioniert wie ein cut-Operator, so dass beim ersten Erfolg keine Zeilen mehr für diesen Kontext ausgewertet werden. –

+0

Große Antworten auf meine Frage. Aber dies ist der, der mir die Ergebnisse liefert, ohne durch viele Reifen springen zu müssen. Ich habe auch alle Spalten mit * ersetzt und das gleiche Ergebnis erzielt. Das kann nützlich sein, wenn alle Spalten/Felder auf der Straße hinzugefügt werden. – Erik

3

Dies kann als Ergebnissatz von A-B union B-A behandelt werden. Ich gehe davon aus, dass alle Spalten in beiden Tabellen identisch sind. Daher die * in select.

(select * from results_prior 
except 
select * from results_current) 
union all 
(select * from results_current 
except 
select * from results_prior) 
Verwandte Themen