sql >> Databáze >  >> RDS >> Sqlserver

Jak se dva níže uvedené aktualizační příkazy liší v SQL?

S vnitřním spojením je rozdíl pouze sémantickým rozdílem. Oba dotazy by měly produkovat přesně stejný plán dotazů a přesně stejný výsledek.

Pokud však používáte vnější spojení, pak záleží na tom, zda je podmínka na where klauzule nebo on klauzule o.

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

Liší se od

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

nejen na sémantické úrovni.
Zatímco první dotaz vrátí očekávaný výsledek pravého spojení, druhý ve skutečnosti vrátí výsledky očekávané od vnitřního spojení.
To proto, že hodnoty pravé tabulky může být null, pokud máte v levé tabulce záznamy, které se s nimi neshodují, a protože porovnání jakékoli hodnoty s hodnotou null (včetně jiné hodnoty null) bude mít za následek nepravdu, v podstatě se změní pravé spojení na vnitřní spojení.



  1. Výjimka připojení ODP.NET

  2. Přehled jedinečných omezení serveru SQL Server

  3. jak získat součet sloupce s dotazem codeigniter

  4. SQL Server Fulltextové vyhledávání Únikové znaky?