Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

En quoi ci-dessous deux instructions de mise à jour sont différentes en SQL ?

Avec une jointure interne, la différence n'est qu'une différence sémantique. Les deux requêtes doivent produire exactement le même plan de requête et exactement le même résultat.

Cependant, lorsque vous utilisez des jointures externes, il est important que la condition soit sur where clause ou on la clause 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())

Est différent 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())

pas seulement au niveau sémantique.
Alors que la première requête renverra le résultat attendu d'une jointure droite, la seconde renverra en fait les résultats attendus d'une jointure interne.
C'est parce que les bonnes valeurs de table peut être null si vous avez des enregistrements sur la table de gauche qui ne leur correspondent pas, et puisque comparer n'importe quelle valeur à null (y compris un autre null) se traduira par un faux, cela change essentiellement la jointure droite en une jointure interne.