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

Funktionsweise von INTERSECT in SQL Server

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.