sql >> Databasteknik >  >> RDS >> Sqlserver

Hur UTOM Fungerar i SQL Server

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.


  1. Konvertera ett månadsnamn till månadsnummer i SQL Server (T-SQL)

  2. Framgångsrika MySQL/MariaDB-strategier för säkerhetskopiering och återställning

  3. Hur kontrollerar jag om en kolumn är tom eller null i MySQL?

  4. Hibernate kunde inte hämta SequenceInformation från databasen