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

In che modo due istruzioni di aggiornamento sono diverse in SQL?

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.