V SQL Server můžete použít T-SQL INTERSECT
operátor, který vrátí odlišné řádky, které jsou výstupem levého i pravého vstupního dotazu.
Syntaxe
Syntaxe vypadá takto:
{ <query_specification> | ( <query_expression> ) }
{ INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Dokumentace společnosti Microsoft ve skutečnosti obsahuje EXCEPT
operátor v jeho definici, protože stejná syntaxe platí pro INTERSECT
a EXCEPT
.
Syntaxe Microsoftu vypadá takto:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Příklad
Představte si, že máte dva stoly; Cats
a Dogs
.
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Brush | | 2 | Scarcat | | 3 | Flutter | | 4 | Flutter | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Yelp | | 2 | Woofer | | 3 | Brush | | 4 | Brush | +---------+-----------+
Všimněte si, že existuje kočka jménem Brush a také dva psi jménem Brush.
Můžeme použít INTERSECT
operátor vrátí pouze odlišné řádky, které jsou výstupem levého i pravého vstupního dotazu.
Jinými slovy, vrátí všechny hodnoty, které se objeví v obou tabulkách, ale vrátí pouze jeden řádek (i když existuje více řádků). Proto v našem případě vrátí Brush
.
Pojďme na to.
SELECT
CatName AS PetName
FROM Cats
INTERSECT
SELECT
DogName AS PetName
FROM Dogs;
Výsledek:
Brush
Jak bylo zmíněno, vrací odlišné řádky, takže v tomto případě je vrácen pouze jeden řádek.
Toto se zobrazí jako LEFT SEMI JOIN
v prováděcím plánu.
Je to podobné, jako když uděláte následující:
SELECT
DISTINCT CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Výsledek:
Brush
Všimněte si, že při použití INTERSECT
, počet a pořadí sloupců musí být ve všech dotazech stejné. Také datové typy musí být kompatibilní. Ve skutečnosti nemusí být stejné, ale musí být srovnatelné prostřednictvím implicitní konverze.
Také při porovnávání hodnot sloupců pro určení DISTINCT
řádky, dva NULL
hodnoty jsou považovány za stejné.
Pokud máte v úmyslu použít INTERSECT
v distribuovaných dotazech si uvědomte, že se spouštějí pouze na místním serveru a nejsou odesílány na propojený server, a to by proto mohlo ovlivnit výkon.