sql >> Database >  >> RDS >> Sqlserver

Hoe EXCEPT werkt in SQL Server

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.


  1. Conversie van een datetime2-gegevenstype naar een datetime-gegevenstype resulteert in een waarde buiten het bereik

  2. PostgreSQL UITLEG – Wat zijn de querykosten?

  3. Databasebeheer en -bewaking voor PostgreSQL 12

  4. Verschil van twee datums in sql-server