In SQL Server können Sie den T-SQL-INTERSECT
verwenden -Operator, um unterschiedliche Zeilen zurückzugeben, die sowohl von der linken als auch von der rechten Eingabeabfrage ausgegeben werden.
Syntax
Die Syntax lautet wie folgt:
{ <query_specification> | ( <query_expression> ) }
{ INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Tatsächlich enthält die Microsoft-Dokumentation den EXCEPT
Operator in seiner Definition, da die gleiche Syntax für INTERSECT
gilt und EXCEPT
.
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 | +---------+-----------+
Beachten Sie, dass es eine Katze namens Brush und zwei Hunde namens Brush gibt.
Wir können den INTERSECT
verwenden -Operator, um nur die eindeutigen Zeilen zurückzugeben, die sowohl von der linken als auch von der rechten Eingabeabfrage ausgegeben werden.
Mit anderen Worten, es werden alle Werte zurückgegeben, die in beiden Tabellen erscheinen, aber es wird nur eine Zeile zurückgegeben (selbst wenn mehrere Zeilen vorhanden sind). Daher wird in unserem Fall Brush
zurückgegeben .
Lass es uns tun.
SELECT
CatName AS PetName
FROM Cats
INTERSECT
SELECT
DogName AS PetName
FROM Dogs;
Ergebnis:
Brush
Wie bereits erwähnt, werden unterschiedliche Zeilen zurückgegeben, sodass in diesem Fall nur eine Zeile zurückgegeben wird.
Dies erscheint als LEFT SEMI JOIN
im Ausführungsplan.
Es ist ähnlich wie Folgendes:
SELECT
DISTINCT CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Ergebnis:
Brush
Beachten Sie dies bei der Verwendung von INTERSECT
, 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, INTERSECT
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.