sql >> Databáze >  >> RDS >> Sqlserver

Jak INTERSECT funguje na serveru SQL Server

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.


  1. Salesforce SOQL od Crystal Reports

  2. Jak počítat položky v čárkami odděleném seznamu MySQL

  3. Šifrování zálohování databáze – doporučené postupy

  4. Jak zjistit, že uživatel je přítomen v databázi Sqlite pomocí Androidu?