Du kan använda T-SQL EXCEPT
operator i SQL Server för att returnera distinkta rader från den vänstra inmatningsfrågan som inte matas ut av den högra inmatningsfrågan.
Syntax
Syntaxen ser ut så här:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) }
Microsofts dokumentation innehåller faktiskt INTERSECT
operatorn i sin definition, eftersom samma syntax gäller för EXCEPT
och INTERSECT
.
Microsofts syntax ser ut så här:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Exempel
Föreställ dig att du har två bord; Cats
och Dogs
.
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Brush | | 2 | Scarcat | | 3 | Flutter | | 4 | Flutter | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Yelp | | 2 | Woofer | | 3 | Brush | | 4 | Brush | +---------+-----------+
Vi kan använda EXCEPT
operatorn för att endast returnera de distinkta raderna från den vänstra inmatningsfrågan som inte matas ut av den högra inmatningsfrågan.
Här är ett exempel.
SELECT CatName FROM Cats
EXCEPT
SELECT DogName FROM Dogs;
Resultat:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Så vi får bara värden som visas i Cats
tabell som inte också visas i Dogs
tabell. Som nämnts returnerar den distinkta rader, så endast en rad returneras för Flutter
.
Vi kan också byta det och sätta Dogs
tabellen till vänster och Cats
till höger.
SELECT DogName FROM Dogs
EXCEPT
SELECT CatName FROM Cats;
Resultat:
+-----------+ | DogName | |-----------| | Woofer | | Yelp | +-----------+
EXCEPT
operatorn visas som en LEFT ANTI SEMI JOIN
i genomförandeplanen.
Så vårt första exempel liknar att göra följande:
SELECT
DISTINCT CatName
FROM Cats c
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Resultat:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Observera att när du använder EXCEPT
, numret och ordningen på kolumnerna måste vara samma i alla frågor. Dessutom måste datatyperna vara kompatibla. De behöver faktiskt inte vara samma, men de måste vara jämförbara genom implicit konvertering.
Även när man jämför kolumnvärden för att bestämma DISTINCT
rader, två NULL
värden anses vara lika.
Om du tänker använda EXCEPT
i distribuerade frågor, observera att det bara körs på den lokala servern och inte skickas till den länkade servern, och detta kan därför påverka prestandan.