U kunt de T-SQL gebruiken EXCEPT
operator in SQL Server om afzonderlijke rijen van de linkerinvoerquery te retourneren die niet worden uitgevoerd door de rechterinvoerquery.
Syntaxis
De syntaxis gaat als volgt:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) }
In feite bevat de Microsoft-documentatie de INTERSECT
operator in zijn definitie, aangezien dezelfde syntaxis van toepassing is op EXCEPT
en INTERSECT
.
De Microsoft-syntaxis gaat als volgt:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Voorbeeld
Stel je voor dat je twee tafels hebt; Cats
en Dogs
.
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Brush | | 2 | Scarcat | | 3 | Flutter | | 4 | Flutter | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Yelp | | 2 | Woofer | | 3 | Brush | | 4 | Brush | +---------+-----------+
We kunnen de EXCEPT
. gebruiken operator om alleen de afzonderlijke rijen van de linkerinvoerquery te retourneren die niet worden uitgevoerd door de rechterinvoerquery.
Hier is een voorbeeld.
SELECT CatName FROM Cats
EXCEPT
SELECT DogName FROM Dogs;
Resultaat:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
We krijgen dus alleen waarden die voorkomen in de Cats
tabel die niet ook voorkomen in de Dogs
tafel. Zoals vermeld, retourneert het verschillende rijen, dus er wordt slechts één rij geretourneerd voor Flutter
.
We kunnen het ook omdraaien en de Dogs
. plaatsen tabel aan de linkerkant en Cats
aan de rechterkant.
SELECT DogName FROM Dogs
EXCEPT
SELECT CatName FROM Cats;
Resultaat:
+-----------+ | DogName | |-----------| | Woofer | | Yelp | +-----------+
De EXCEPT
operator verschijnt als een LEFT ANTI SEMI JOIN
in het uitvoeringsplan.
Dus ons eerste voorbeeld lijkt op het volgende:
SELECT
DISTINCT CatName
FROM Cats c
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Resultaat:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Merk op dat bij gebruik van EXCEPT
, moeten het aantal en de volgorde van de kolommen in alle zoekopdrachten hetzelfde zijn. Ook moeten de gegevenstypen compatibel zijn. Ze hoeven eigenlijk niet hetzelfde te zijn, maar ze moeten wel vergelijkbaar zijn door middel van impliciete conversie.
Ook bij het vergelijken van kolomwaarden voor het bepalen van DISTINCT
rijen, twee NULL
waarden worden als gelijk beschouwd.
Als u van plan bent om EXCEPT
. te gebruiken Houd er bij gedistribueerde zoekopdrachten rekening mee dat het alleen op de lokale server wordt uitgevoerd en niet naar de gekoppelde server wordt gepusht, en dit kan daarom de prestaties beïnvloeden.