sql >> Databasteknik >  >> RDS >> Sqlserver

Hur INTERSECT fungerar i SQL Server

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.


  1. Hur uppdaterar jag om det finns, infogar om inte (AKA upsert or merge) i MySQL?

  2. Introduktion till Python SQL-bibliotek

  3. Close kallades aldrig uttryckligen på Database

  4. Kan inte installera pg gem på Windows