Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como abaixo duas instruções de atualização são diferentes no SQL?


Com uma junção interna, a diferença é apenas uma diferença semântica. Ambas as consultas devem produzir exatamente o mesmo plano de consulta e exatamente o mesmo resultado.

No entanto, quando você está usando associações externas, importa se a condição está no where cláusula ou on a cláusula sobre.
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())

É diferente de
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())

não apenas no nível semântico.
Enquanto a primeira consulta retornará o resultado esperado de uma junção correta, a segunda retornará de fato os resultados esperados de uma junção interna.
Isso ocorre porque os valores corretos da tabela pode ser nulo se você tiver registros na tabela esquerda que não correspondam a eles e, como comparar qualquer valor com nulo (incluindo outro nulo) resultará em falso, é basicamente alterar a junção direita para uma junção interna.