sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo debajo de dos declaraciones de actualización son diferentes en SQL?

Con una unión interna, la diferencia es solo una diferencia semántica. Ambas consultas deben producir exactamente el mismo plan de consulta y exactamente el mismo resultado.

Sin embargo, cuando usa uniones externas, importa si la condición está en el where cláusula o on la cláusula on.

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())

es diferente a

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())

no solo en el nivel semántico.
Mientras que la primera consulta arrojará el resultado esperado de una combinación correcta, la segunda de hecho arrojará los resultados esperados de una combinación interna.
Eso se debe a que los valores de la tabla correcta podría ser nulo si tiene registros en la tabla de la izquierda que no coinciden, y dado que comparar cualquier valor con nulo (incluido otro nulo) dará como resultado un falso, básicamente está cambiando la unión derecha a una unión interna.