Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie unterscheiden sich die folgenden zwei Update-Anweisungen in SQL?

Bei einem Inner Join ist der Unterschied nur ein semantischer Unterschied. Beide Abfragen sollten genau denselben Abfrageplan und dasselbe Ergebnis erzeugen.

Wenn Sie jedoch äußere Verknüpfungen verwenden, ist es wichtig, ob sich die Bedingung auf dem where befindet -Klausel oder on die on-Klausel.

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

Unterscheidet sich von

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

nicht nur auf semantischer Ebene.
Während die erste Abfrage das erwartete Ergebnis eines Right Joins liefert, liefert die zweite die Ergebnisse, die von einem Inner Join erwartet werden.
Das liegt an den richtigen Tabellenwerten könnte null sein, wenn Sie Datensätze in der linken Tabelle haben, die nicht mit ihnen übereinstimmen, und da der Vergleich eines beliebigen Werts mit null (einschließlich einer anderen null) zu einem falschen Ergebnis führt, wird im Grunde der rechte Join in einen inneren Join geändert.