Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come eseguire un ANTI SEMI JOIN SINISTRO in SQL Server

A LEFT ANTI SEMI JOIN è un tipo di join che restituisce solo quelle righe distinte nel set di righe di sinistra che non hanno una riga corrispondente nel set di righe di destra.

Ma quando si utilizza T-SQL in SQL Server, se si tenta di utilizzare esplicitamente LEFT ANTI SEMI JOIN nella tua query, probabilmente riceverai il seguente errore:

Msg 155, Level 15, State 1, Line 4
'ANTI' is not a recognized join option.

Fortunatamente, SQL Server include EXCEPT operatore, che ci permette di eseguire un LEFT ANTI SEMI JOIN .

Quando usi EXCEPT operatore, appare nel piano di esecuzione della query come LEFT ANTI SEMI JOIN .

Puoi anche costruire una sottoquery che faccia la stessa cosa.

Esempio

Immagina di avere due tavoli; Cats e Dogs , quindi eseguiamo la seguente query:

SELECT 
    CatName AS PetName
FROM Cats
EXCEPT
SELECT 
    DogName AS PetName
FROM Dogs;

Questa query utilizza EXCEPT operatore e apparirà come LEFT ANTI SEMI JOIN nel piano di esecuzione.

È simile a fare quanto segue:

SELECT 
    DISTINCT CatName
FROM Cats c 
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Ecco il piano di esecuzione per quella query:

Se usi U-SQL con Azure Data Lake Analytics, puoi usare ANTISEMIJOIN clausola per fare anti semi join destro e sinistro. Cioè, puoi usare LEFT ANTISEMIJOIN o RIGHT ANTISEMIJOIN .