sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan UNDTAGET virker i SQL Server

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.


  1. Vælg værdier fra XML-feltet i SQL Server 2008

  2. Sådan fungerer LOG10() i MariaDB

  3. PASS Summit 2013 :En succes i Charlotte

  4. Er det muligt at slette fra flere tabeller i samme SQL-sætning?