T-SQL Deep Dive: Except & Intersect

17. April 2014

Dies ist vierte Teil einer Serie in der ich nützliche T-SQL Befehle vorstellen möchte, welche wenig bekannt sind oder nur selten eingesetzt werden.

Eine Übersicht über alle Artikel ist hier zu finden.

Als Entwickler steht man häufig vor der Aufgabe mehrere Tabellen oder Abfragen miteinander zu vergleich um zu ermitteln welche Daten identisch sind und welche nicht. Im SQL-Server werden hierzu meist so genannte "Set Operatoren" verwendet. Am bekanntesten ist sicherlich der UNION Operator. Weniger bekannt sind EXCEPT und INTERSECT die ich in dem heutigen Artikel vorstellen möchte.

Beide Operatoren wurden bereits mit SQL Server 2005 eingeführt. Für die Verwendung dieser Operatoren gelten die gleichen Bedingungen wie für den UNION Operator:

  1. Die Anzahl und die Reihefolge der Felder in beiden Abfragen muss identisch sein.
  2. Die Datentypen der Felder müssen miteinander kompatible sein.

EXCEPT gibt alle Werte aus der ersten Abfrage zurück, welche nicht in der zweiten enthalten sind.

INTERSECT gibt alle Werte aus zwei Abfragen zurück, die sowohl in der ersten als auch in der zweiten Abfrage enthalten sind.

Eine Grafik sagt hier mehr als tausend Worte:

Except & Intersect

Für die Beispiele erstellen wir zwei Tabellenvariablen mit Zahlen. Die erste Tabelle enthält alle ungeraden natürlichen Zahlen von eins bis neun, die zweite alle Primzahlen in diesem Bereich.

DECLARE @UngeradeZahlen AS TABLE (
Zahl int
)
DECLARE @Primzahlen AS TABLE (
Zahl int
)

INSERT INTO @UngeradeZahlen VALUES (1),(3),(5),(7),(9)

INSERT INTO @Primzahlen VALUES (2),(3),(5),(7)

UNION liefert eine sortierte und um Duplicate bereinigte Liste aller ungeraden und aller Primzahlen:

SELECT * FROM @UngeradeZahlen
UNION
SELECT * FROM @Primzahlen



Zahl
-----------
1
2
3
5
7
9

Mit EXECEPT können wir alle ungeraden Zahlen anzeigen lassen, welche keine Primzahl sind:

SELECT * FROM @UngeradeZahlen
EXCEPT
SELECT * FROM @Primzahlen



Zahl
-----------
1
9

Wenn wir die Reihenfolge umkehren bekommen wir alle geraden Primzahlen:

SELECT * FROM @Primzahlen
EXCEPT
SELECT * FROM @UngeradeZahlen

Zahl
-----------
2

INTERSECT liefert eine Liste aller ungeraden Primzahlen, dabei ist die Reihenfolge der Abfragen unerheblich:

SELECT * FROM @Primzahlen
INTERSECT
SELECT * FROM @UngeradeZahlen

Bzw.

SELECT * FROM @UngeradeZahlen
INTERSECT
SELECT * FROM @Primzahlen

Zahl
-----------
3
5
7

Fazit

EXCEPT und INTERSECT sind ungemein hilfreiche Befehle zur Datenanalyse. Mit ihnen ist es möglich mit einer gut lesbaren Abfrage die Unterschiede oder Gemeinsamkeiten zwischen zwei Sets zu ermitteln.