W SQL Server możesz użyć T-SQL INTERSECT
operatora, aby zwrócić różne wiersze, które są wyprowadzane zarówno przez lewe, jak i prawe zapytanie wejściowe.
Składnia
Składnia wygląda tak:
{ <query_specification> | ( <query_expression> ) }
{ INTERSECT }
{ <query_specification> | ( <query_expression> ) }
W rzeczywistości dokumentacja Microsoft zawiera EXCEPT
operator w swojej definicji, ponieważ ta sama składnia dotyczy INTERSECT
i EXCEPT
.
Składnia Microsoftu wygląda następująco:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Przykład
Wyobraź sobie, że masz dwa stoły; Cats
i Dogs
.
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Brush | | 2 | Scarcat | | 3 | Flutter | | 4 | Flutter | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Yelp | | 2 | Woofer | | 3 | Brush | | 4 | Brush | +---------+-----------+
Zauważ, że jest kot o imieniu Pędzel i są też dwa psy o imieniu Pędzel.
Możemy użyć INTERSECT
operatora, aby zwrócić tylko odrębne wiersze, które są wyprowadzane przez zarówno lewe, jak i prawe zapytanie wejściowe.
Innymi słowy, zwróci wszystkie wartości, które pojawiają się w obu tabelach, ale zwróci tylko jeden wiersz (nawet jeśli jest wiele wierszy). Dlatego w naszym przypadku zwróci Brush
.
Zróbmy to.
SELECT
CatName AS PetName
FROM Cats
INTERSECT
SELECT
DogName AS PetName
FROM Dogs;
Wynik:
Brush
Jak wspomniano, zwraca różne wiersze, więc w tym przypadku zwracany jest tylko jeden wiersz.
Pojawia się jako LEFT SEMI JOIN
w planie wykonania.
Jest to podobne do wykonywania następujących czynności:
SELECT
DISTINCT CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Wynik:
Brush
Zwróć uwagę, że używając INTERSECT
, liczba i kolejność kolumn muszą być takie same we wszystkich zapytaniach. Ponadto typy danych muszą być zgodne. W rzeczywistości nie muszą być takie same, ale muszą być porównywalne poprzez niejawną konwersję.
Również podczas porównywania wartości kolumn w celu określenia DISTINCT
wiersze, dwa NULL
wartości są uważane za równe.
Jeśli zamierzasz użyć INTERSECT
w zapytaniach rozproszonych należy pamiętać, że jest on wykonywany tylko na serwerze lokalnym i nie jest przesyłany do serwera połączonego, co może wpłynąć na wydajność.