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.