Du kan bruge T-SQL EXCEPT
operatør i SQL Server for at returnere adskilte rækker fra den venstre inputforespørgsel, som ikke udlæses af den højre inputforespørgsel.
Syntaks
Syntaksen ser sådan ud:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) }
Faktisk inkluderer Microsoft-dokumentationen INTERSECT
operator i sin definition, da den samme syntaks gælder for EXCEPT
og INTERSECT
.
Microsoft-syntaksen ser sådan ud:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Eksempel
Forestil dig, at du har to borde; Cats
og Dogs
.
Cats
+--------+-----------+| CatId | Kattenavn ||--------+-----------|| 1 | Børste || 2 | Scarcat || 3 | Fladder || 4 | Fladder |+--------+-----------+
Dogs
+--------+-----------+| DogId | Hundenavn ||--------+--------|| 1 | Yelp || 2 | Bashøjttaler || 3 | Børste || 4 | Børste |+--------+-----------+
Vi kan bruge EXCEPT
operatør for kun at returnere de adskilte rækker fra den venstre inputforespørgsel, som ikke udlæses af den højre inputforespørgsel.
Her er et eksempel.
SELECT CatName FROM Cats
EXCEPT
SELECT DogName FROM Dogs;
Resultat:
+------------+| Kattenavn ||--------|| Fladder || Scarcat |+-----------+
Så vi får kun værdier, der vises i Cats
tabel, der ikke også vises i Dogs
bord. Som nævnt returnerer det distinkte rækker, så kun én række returneres for Flutter
.
Vi kan også skifte det rundt og sætte Dogs
tabel til venstre og Cats
til højre.
SELECT DogName FROM Dogs
EXCEPT
SELECT CatName FROM Cats;
Resultat:
+------------+| Hundenavn ||--------|| Bashøjttaler || Yelp |+-----------+
EXCEPT
operator vises som en LEFT ANTI SEMI JOIN
i udførelsesplanen.
Så vores første eksempel ligner at gøre følgende:
SELECT
DISTINCT CatName
FROM Cats c
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Resultat:
+------------+| Kattenavn ||--------|| Fladder || Scarcat |+-----------+
Bemærk, at når du bruger EXCEPT
, skal antallet og rækkefølgen af kolonnerne være den samme i alle forespørgsler. Datatyperne skal også være kompatible. De behøver faktisk ikke at være ens, men de skal være sammenlignelige gennem implicit konvertering.
Også når man sammenligner kolonneværdier for at bestemme DISTINCT
rækker, to NULL
værdier betragtes som ens.
Hvis du har til hensigt at bruge EXCEPT
i distribuerede forespørgsler, bemærk, at det kun udføres på den lokale server og ikke pushes til den sammenkædede server, og dette kan derfor påvirke ydeevnen.