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.