Sie können das T-SQL EXCEPT
verwenden Operator in SQL Server, um eindeutige Zeilen aus der linken Eingabeabfrage zurückzugeben, die nicht von der rechten Eingabeabfrage ausgegeben werden.
Syntax
Die Syntax lautet wie folgt:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) }
Tatsächlich enthält die Microsoft-Dokumentation den INTERSECT
Operator in seiner Definition, da die gleiche Syntax für EXCEPT
gilt und INTERSECT
.
Die Microsoft-Syntax sieht folgendermaßen aus:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Beispiel
Stellen Sie sich vor, Sie haben zwei Tabellen; Cats
und Dogs
.
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Brush | | 2 | Scarcat | | 3 | Flutter | | 4 | Flutter | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Yelp | | 2 | Woofer | | 3 | Brush | | 4 | Brush | +---------+-----------+
Wir können den EXCEPT
verwenden -Operator, um nur die unterschiedlichen Zeilen aus der linken Eingabeabfrage zurückzugeben, die nicht von der rechten Eingabeabfrage ausgegeben werden.
Hier ist ein Beispiel.
SELECT CatName FROM Cats
EXCEPT
SELECT DogName FROM Dogs;
Ergebnis:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Wir erhalten also nur Werte, die in den Cats
vorkommen Tabelle, die nicht auch in Dogs
erscheinen Tisch. Wie bereits erwähnt, werden unterschiedliche Zeilen zurückgegeben, sodass für Flutter
nur eine Zeile zurückgegeben wird .
Wir können es auch umstellen und die Dogs
platzieren Tisch links und Cats
rechts.
SELECT DogName FROM Dogs
EXCEPT
SELECT CatName FROM Cats;
Ergebnis:
+-----------+ | DogName | |-----------| | Woofer | | Yelp | +-----------+
Der EXCEPT
Operator erscheint als LEFT ANTI SEMI JOIN
im Ausführungsplan.
Unser erstes Beispiel ähnelt also dem folgenden:
SELECT
DISTINCT CatName
FROM Cats c
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Ergebnis:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Beachten Sie dies bei Verwendung von EXCEPT
, müssen die Anzahl und die Reihenfolge der Spalten in allen Abfragen gleich sein. Außerdem müssen die Datentypen kompatibel sein. Sie müssen nicht unbedingt gleich sein, aber sie müssen durch implizite Konvertierung vergleichbar sein.
Auch beim Vergleich von Spaltenwerten zur Bestimmung von DISTINCT
Zeilen, zwei NULL
Werte gelten als gleich.
Wenn Sie beabsichtigen, EXCEPT
zu verwenden Beachten Sie bei verteilten Abfragen, dass sie nur auf dem lokalen Server ausgeführt und nicht auf den Verbindungsserver gepusht werden, und dies daher die Leistung beeinträchtigen könnte.