Możesz użyć T-SQL EXCEPT
operator w SQL Server, aby zwrócić różne wiersze z lewego zapytania wejściowego, które nie są wyprowadzane przez prawe zapytanie wejściowe.
Składnia
Składnia wygląda tak:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) }
Właściwie dokumentacja firmy Microsoft zawiera INTERSECT
operator w swojej definicji, ponieważ ta sama składnia dotyczy EXCEPT
i INTERSECT
.
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 | +---------+-----------+
Możemy użyć EXCEPT
operator, aby zwrócić tylko odrębne wiersze z lewego zapytania wejściowego, które nie są wyprowadzane przez prawe zapytanie wejściowe.
Oto przykład.
SELECT CatName FROM Cats
EXCEPT
SELECT DogName FROM Dogs;
Wynik:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Więc otrzymujemy tylko wartości, które pojawiają się w Cats
tabela, która nie pojawia się również w Dogs
stół. Jak wspomniano, zwraca różne wiersze, więc tylko jeden wiersz jest zwracany dla Flutter
.
Możemy też to zmienić i umieścić Dogs
tabela po lewej i Cats
po prawej.
SELECT DogName FROM Dogs
EXCEPT
SELECT CatName FROM Cats;
Wynik:
+-----------+ | DogName | |-----------| | Woofer | | Yelp | +-----------+
EXCEPT
operator pojawia się jako LEFT ANTI SEMI JOIN
w planie wykonania.
Nasz pierwszy przykład jest podobny do tego, co następuje:
SELECT
DISTINCT CatName
FROM Cats c
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Wynik:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Zwróć uwagę, że używając EXCEPT
, 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żywać EXCEPT
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ść.