Kategorien
Programmierung SQL

SQL: Nur Sätze die nicht in zweiter Tabelle, dabei Vergleich mehrerer Felder

Aufgabe:
Es sollen alle Sätze aus einer Tabelle gefunden werden, die in einer anderen Tabelle nicht enthalten sind.
Dabei müssen allerdings mehrere Felder verglichen werden bzw. deren Kombinationen.

Im vorliegenden Beispiel wären das die Felder Artikelnummer (identnr) und Artikelvariante (var) und die Tabellen D100 und K010:

Hier eine Lösungsmöglichkeit unter Oracle die aus den mehreren zu vergleichenden Feldern schlicht eines baut und dieses dann vergleicht:

SELECT IDENTNR, VAR
FROM   D100
WHERE  CONCAT(IDENTNR, VAR) NOT IN (SELECT CONCAT(IDENTNR, VAR) FROM K010)

Info: CONCAT kann unter Oracle dabei nur zwei Felder zusammenfügen. Um mehrere Felder zu verknüpfen müsste man CONCAT verschachtelt verwenden oder ggf. mit dem „||“ arbeiten (letzteres ungetestet).

Ohne diesen „Trick“ könnte ein entsprechendes Statement zum vergleich zweier Felder in Kombination auch so aussehen:

SELECT IDENTNR, VAR
FROM   D100
WHERE  IDENTNR NOT IN (SELECT IDENTNR FROM K010)
   OR  VAR NOT IN (SELECT VAR FROM K010 WHERE K010.IDENTNR = D100.IDENTNR)

Dabei wird hier bereits in der ersten WHERE-Klausel abgebrochen, wenn nur die gesuchte IDENTNR schon nicht vorkommt.
Dieses SQL ist im Duchlauf um einiges schneller als die obige Lösung, hat aber auch seine Grenzen in der Anzahl der vergleichbaren Felder.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert