Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak poniższe dwie instrukcje aktualizacji różnią się w SQL?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak ustawić domyślny język dla wszystkich nowych loginów w SQL Server (T-SQL)

  2. Które tabele są bardziej wydajne, CTE czy tymczasowe?

  3. znajdź najbliższą lokalizację w ms-sql

  4. Radzenie sobie z błędami o wysokim stopniu ważności w SQL Server

  5. Demistyfikacja typów oczekiwania CXPACKET i CXCONSUMER w SQL Server