Differenz mit Select über 2 gleiche Tabellen

Roefe68

Grünschnabel
Differenz mit Select über 2 gleiche Tabellen (MS-SQL)

Hallo zusammen

Arbeite Neuerdings mit dem Microsoft SQL-Server.

Möchte Tabelle1 "Kasse" und Tabelle 2 "Kasse_Remote" so abfragen, dass ich am Schluss als Result die Datensätze erhalte, welche in der Tabelle2 vorhanden sind, nicht aber in der Tabelle 1.

Mit folgendem SQL funktioniert das, aber nur über die Spalte 1(Mdt):
Code:
SELECT *FROM   Kasse_remote
WHERE  Mdt NOT IN (SELECT Mdt FROM Kasse)
Was kann ich tun, dass nicht nur die Spalte Mdt überprüft wird, sondern ebenfalls die Spalten Betr,BonNr,PosNr überprüft werden?
Die DB Kann ich nicht ändern, ist ein Fremdprodukt.
Die Spalten Mdt,Betr,BonNr,PosNr sind Indexfelder

Danke für die Hilfe.
 
Zuletzt bearbeitet:
Ich bin mir nicht ganz sicher, ob die Syntax auch in MSSQL richtig ist, aber vom Prinzip musst Du nur der WHERE-Klausel weitere Bedingungen hinzufügen:
Code:
SELECT * FROM Kasse_remote
WHERE Mdt NOT IN (SELECT Mdt FROM Kasse)
   AND Betr NOT IN (SELECT Betr FROM Kasse)
   AND # und so weiter
In MySQL müßte auch folgendes funktionieren, habe ich aber noch nicht getestet:
Code:
SELECT * FROM Kasse_remote
WHERE ROW(Mdt,Betr,BonNr,PosNr) 
  NOT IN (SELECT Mdt,Betr,BonNr,PosNr FROM Kasse)
Gruß hpvw
 
Hallo zusammen, hpvw - danke für die schnelle Antwort.

So sehen die Tabellen aus:

Tabelle1 "Kasse"
Mdt Betr BonNr PosNr
1000 1 1 1
1000 1 2 1
1000 1 3 1

Tabelle1 "Kasse_REMOTE"
Mdt Betr BonNr PosNr
1001 2 1 1
1001 2 2 1
1001 2 3 1

Die Spalte Mdt,Btr,Bon und PosNr sind pro Datenbank gleich.
Das heisst wenn ich die Abfrage so ausführe, erhalte ich nachdem ich die Daten zu Statistikzwecken zusammenführen will keine Datensätze mehr.
Ich müsste die Abfrage also über die 4 Spalten ausführen oder ähnlich, habe aber keinen blassen Schimmer, wie das geht.

Code:
SELECT * FROM Kasse_remote
WHERE (Mdt NOT IN (SELECT Mdt FROM Kasse)
   AND Betr NOT IN (SELECT Betr FROM Kasse)
     AND BonNr NOT IN (SELECT BonNr FROM Kasse)
        AND PosNr NOT IN (SELECT PosNr FROM Kasse))
habe ich versucht, aber dann ist natürlich alles leer, weil BONNr und PosNr gleich sind in beiden Tables


Weitere Ideen?
 
Ah, jetzt verstehe ich Dein Dilemma.

Wenn es die oben angedeutete ROW-Syntax auch in MSSQL gibt, könnte das Dein Problem lösen. Ansonsten wird der JOIN-Workaround mal zur echten Alternative:
Code:
SELECT * 
FROM Kasse_remote
LEFT JOIN Kasse 
  ON Kasse_remote.Mdt = Kasse.Mdt
   AND Kasse_remote.Betr = Kasse.Betr
   AND Kasse_remote.BonNr= Kasse.BonNr
   AND Kasse_remote.PosNr = Kasse.PosNr
WHERE Kasse.Mdt IS NULL
Beachte, dass das Kasse-Feld in der WHERE-Klausel ein beliebiges Feld aus der Tabelle Kasse sein kann, es muss lediglich als NOT NULL deklariert sein.
Da ich nicht so fit in MSSQL bin, habe ich Dir die MySQL-Syntax gepostet, die Du ggf. noch etwas abändern musst, damit sie in MSSQL funktioniert. Das Verhalten der Datenbanken sollte jedoch gleich sein.

Gruß hpvw
 

Neue Beiträge

Zurück