sql >> Database >  >> RDS >> Sqlserver

Hoe INTERSECT werkt in SQL Server

In SQL Server kunt u de T-SQL INTERSECT . gebruiken operator om afzonderlijke rijen te retourneren die worden uitgevoerd door zowel de linker- als de rechterinvoerquery.

Syntaxis

De syntaxis gaat als volgt:

{ <query_specification> | ( <query_expression> ) }   
{ INTERSECT }  
{ <query_specification> | ( <query_expression> ) }

In feite bevat de Microsoft-documentatie de EXCEPT operator in zijn definitie, aangezien dezelfde syntaxis van toepassing is op INTERSECT en EXCEPT .

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     |
+---------+-----------+

Merk op dat er een kat is die Brush heet en dat er ook twee honden zijn die Brush heet.

We kunnen de INTERSECT . gebruiken operator om alleen de afzonderlijke rijen te retourneren die worden uitgevoerd door zowel de linker- als de rechterinvoerquery.

Met andere woorden, het retourneert alle waarden die in beide tabellen voorkomen, maar het retourneert slechts één rij (zelfs als er meerdere rijen zijn). Daarom zal het in ons geval Brush . teruggeven .

Laten we het doen.

SELECT 
    CatName AS PetName
FROM Cats
INTERSECT
SELECT 
    DogName AS PetName
FROM Dogs;

Resultaat:

Brush

Zoals vermeld, retourneert het verschillende rijen, dus in dit geval wordt slechts één rij geretourneerd.

Dit verschijnt als een LEFT SEMI JOIN in het uitvoeringsplan.

Het lijkt op het volgende doen:

SELECT 
    DISTINCT CatName
FROM Cats c 
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Resultaat:

Brush

Merk op dat bij gebruik van INTERSECT , 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 INTERSECT . 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. Operand moet 1 kolom bevatten - MySQL NIET IN

  2. Werken met cPanel MySQL-databases

  3. Oracle Data Integrator (ODI)

  4. VARRAY's maken als databaseobject in Oracle Database?