In generale, IN
e JOIN
sono query diverse che possono produrre risultati diversi.
SELECT a.*
FROM a
JOIN b
ON a.col = b.col
non è uguale a
SELECT a.*
FROM a
WHERE col IN
(
SELECT col
FROM b
)
, a meno che b.col
è unico.
Tuttavia, questo è il sinonimo della prima query:
SELECT a.*
FROM a
JOIN (
SELECT DISTINCT col
FROM b
)
ON b.col = a.col
Se la colonna di unione è UNIQUE
e contrassegnate come tali, entrambe queste query producono lo stesso piano in SQL Server
.
Se non lo è, allora IN
è più veloce di JOIN
su DISTINCT
.
Vedi questo articolo nel mio blog per i dettagli sulle prestazioni:
IN
rispetto aJOIN
rispetto aEXISTS