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.