I SQL Server kan du använda T-SQL INTERSECT
operatorn för att returnera distinkta rader som matas ut av både vänster och höger inmatningsfrågor.
Syntax
Syntaxen ser ut så här:
{ <query_specification> | ( <query_expression> ) }
{ INTERSECT }
{ <query_specification> | ( <query_expression> ) }
I själva verket innehåller Microsoft-dokumentationen EXCEPT
operatorn i sin definition, eftersom samma syntax gäller för INTERSECT
och EXCEPT
.
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 | +---------+-----------+
Lägg märke till att det finns en katt som heter Brush och det finns även två hundar som heter Brush.
Vi kan använda INTERSECT
operatorn för att endast returnera de distinkta raderna som matas ut av både vänster och höger inmatningsfrågor.
Med andra ord kommer den att returnera alla värden som visas i båda tabellerna, men den returnerar bara en rad (även om det finns flera rader). Därför kommer den i vårt fall att returnera Brush
.
Låt oss göra det.
SELECT
CatName AS PetName
FROM Cats
INTERSECT
SELECT
DogName AS PetName
FROM Dogs;
Resultat:
Brush
Som nämnts returnerar den distinkta rader, så endast en rad returneras i detta fall.
Detta visas som en LEFT SEMI JOIN
i genomförandeplanen.
Det liknar att göra följande:
SELECT
DISTINCT CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Resultat:
Brush
Observera att när du använder INTERSECT
, 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 INTERSECT
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.