Ausführen von Semi-Join-Vorgängen mit EXCEPT und INTERSECT

Eine Semiverknüpfung gibt Zeilen aus der ersten Eingabe zurück, wenn in der zweiten Eingabe mindestens eine übereinstimmende Zeile vorhanden ist. Eine Antiverknüpfung gibt Zeilen aus der ersten Eingabe zurück, wenn in der zweiten Eingabe keine übereinstimmenden Zeilen vorhanden sind. Zum Ausführen von Semi- und Antiverknüpfungen werden der EXCEPT-Operator und der INTERSECT-Operator verwendet. Diese Operatoren ermöglichen es Ihnen, die Ergebnisse von zwei oder mehr SELECT-Anweisungen miteinander zu vergleichen und unterschiedliche Werte zurückgeben zu lassen.Der EXCEPT-Operator gibt sämtliche unterschiedlichen Werte der Abfrage links vom EXCEPT-Operator zurück, die nicht von der Abfrage rechts zurückgegeben werden. INTERSECT gibt sämtliche unterschiedlichen Werte zurück, die von der Abfrage links und rechts vom INTERSECT-Operator zurückgegeben werden. Die mithilfe von EXCEPT oder INTERSECT verglichenen Resultsets müssen alle dieselbe Struktur aufweisen. Sie müssen über dieselbe Anzahl an Spalten verfügen, und die einander entsprechenden Resultsetspalten müssen kompatible Datentypen aufweisen. Weitere Informationen finden Sie unter EXCEPT und INTERSECT (Transact-SQL).

Betrachten Sie die Tabellen TableA, TableB und TableC mit folgenden Daten in ihrer jeweiligen int-Spalte col1.

TableA (col1 int)

TableB (col1 int)

TableC (col1 int)

NULL

NULL

2

NULL

1

2

NULL

3

2

1

4

4

2

4

4

2

2

3

4

4

mithilfe von EXCEPT gibt folgende Abfrage sämtliche unterschiedlichen Werte der Abfrage links vom EXCEPT-Operand, die in der rechten Abfrage nicht gefunden wurden.

SELECT * FROM TableA EXCEPT SELECT * FROM TableB

Dies ist das Resultset.

Col1       
----------- 
2

(1 row(s) affected)

mithilfe von INTERSECT gibt diese Abfrage sämtliche unterschiedlichen Werte zurück, die von der Abfrage links und rechts vom INTERSECT-Operator zurückgegeben werden.

SELECT * FROM TableA INTERSECT SELECT * FROM TableB

Dies ist das Resultset.

Col1       
----------- 
NULL
1
3
4

(4 row(s) affected)

Der INTERSECT-Operator hat gegenüber EXCEPT Vorrang. In folgender Abfrage werden beispielsweise beide Operatoren verwendet:

SELECT * FROM TableA EXCEPT SELECT * FROM TableB INTERSECT SELECT * FROM TableC

Dies ist das Resultset.

Col1       
----------- 
NULL
1
2
3

(4 row(s) affected)