Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Funktionsweise von EXCEPT in SQL Server

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.