W przypadku sprzężenia wewnętrznego różnica jest tylko różnicą semantyczną. Oba zapytania powinny generować dokładnie ten sam plan zapytań i dokładnie ten sam wynik.
Jednak gdy używasz złączeń zewnętrznych, ważne jest, czy warunek jest na where
klauzula lub on
klauzula 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())
Jest inny niż
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())
nie tylko na poziomie semantycznym.
Podczas gdy pierwsze zapytanie zwróci oczekiwany wynik prawego sprzężenia, drugie faktycznie zwróci wyniki oczekiwane z wewnętrznego sprzężenia.
To dlatego, że prawidłowe wartości tabeli może być null, jeśli w lewej tabeli znajdują się rekordy, które do nich nie pasują, a ponieważ porównywanie dowolnej wartości z wartością null (w tym innej wartości null) da w wyniku fałsz, zasadniczo zmienia to prawe sprzężenie na sprzężenie wewnętrzne.