Il collegamento di Joe è un buon punto di partenza. Quassnoi copre anche questo.
In generale, se i tuoi campi sono correttamente indicizzati OPPURE se prevedi di filtrare più record (ad esempio, hai molte righe EXIST nella sottoquery) NOT EXISTS funzionerà meglio.
EXISTS e NOT EXISTS entrambi vanno in cortocircuito:non appena un record soddisfa i criteri, viene incluso o filtrato e l'ottimizzatore passa al record successivo.
LEFT JOIN si unirà a TUTTI I RECORD indipendentemente dal fatto che corrispondano o meno, quindi filtra tutti i record non corrispondenti. Se le tue tabelle sono grandi e/o hai più JOIN criteri, questo può essere molto molto dispendioso in termini di risorse.
Normalmente provo a usare NOT EXISTS e EXISTS dove possibile. Per SQL Server, IN e NOT IN sono semanticamente equivalenti e possono essere più facili da scrivere. Questi sono tra gli unici operatori che troverai in SQL Server a cui è garantito il cortocircuito.