Con un inner join, la differenza è solo una differenza semantica. Entrambe le query dovrebbero produrre lo stesso identico piano di query e lo stesso identico risultato.
Tuttavia, quando utilizzi gli outer join, è importante se la condizione è su where
clausola o on
la clausola di attivazione.
UPDATE li
SET li.Description = im.Description
FROM tbSupplierLineItem li
RIGHT JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode
AND li.ProcessedDate >= CONVERT(DATE,GETDATE())
È diverso da
UPDATE li
SET li.Description = im.Description
FROM tbSupplierLineItem li
RIGHT JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode
WHERE li.ProcessedDate >= CONVERT(DATE,GETDATE())
non solo a livello semantico.
Mentre la prima query restituirà il risultato atteso di un join corretto, la seconda restituirà infatti i risultati attesi da un join interno.
Questo perché i valori di tabella corretti potrebbe essere nullo se nella tabella di sinistra sono presenti record che non corrispondono a loro e poiché il confronto di qualsiasi valore con null (incluso un altro null) risulterà con un false, sostanzialmente sta cambiando il join destro in un inner join.