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

Sådan fungerer INTERSECT i SQL Server

I SQL Server kan du bruge T-SQL INTERSECT operator for at returnere distinkte rækker, der udskrives af både venstre og højre inputforespørgsler.

Syntaks

Syntaksen ser sådan ud:

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

Faktisk inkluderer Microsoft-dokumentationen EXCEPT operator i sin definition, da den samme syntaks gælder for INTERSECT og EXCEPT .

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

Bemærk, at der er en kat, der hedder Brush, og der er også to hunde, der hedder Brush.

Vi kan bruge INTERSECT operatør for kun at returnere de adskilte rækker, der udlæses af både venstre og højre inputforespørgsler.

Med andre ord vil det returnere alle værdier, der vises i begge tabeller, men det vil kun returnere én række (selvom der er flere rækker). Derfor vil den i vores tilfælde returnere Brush .

Lad os gøre det.

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

Resultat:

Børste

Som nævnt returnerer den distinkte rækker, så kun én række returneres i dette tilfælde.

Dette vises som en LEFT SEMI JOIN i udførelsesplanen.

Det svarer til at gøre følgende:

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

Resultat:

Børste

Bemærk, at når du bruger INTERSECT , 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 kunne sammenlignes 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 INTERSECT 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. Opret en DML Trigger i SQL Server

  2. Tilføj 2 måneder til det nuværende tidsstempel

  3. Sikkerhedstilgange i datamodellering. Del 4

  4. Sådan opbevarer du bedst brugeroplysninger og brugerlogin og adgangskode