sql >> Database >  >> RDS >> Sqlserver

Hoe verschillen onderstaande twee update-instructies in SQL?

Bij een inner join is het verschil slechts een semantisch verschil. Beide zoekopdrachten zouden exact hetzelfde zoekopdrachtplan en exact hetzelfde resultaat moeten opleveren.

Als u echter outer joins gebruikt, maakt het uit of de voorwaarde op de where . staat clausule of on de aan-clausule.

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

Is anders dan

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

niet alleen op semantisch niveau.
Terwijl de eerste query het verwachte resultaat van een juiste join retourneert, retourneert de tweede in feite de verwachte resultaten van een inner join.
Dat komt omdat de juiste tabelwaarden kan null zijn als je records in de linkertabel hebt die er niet mee overeenkomen, en aangezien het vergelijken van een waarde met null (inclusief een andere null) resulteert in een false, verandert het in feite de rechter join in een inner join.



  1. MySQL waarom cursor.execute(sql, multi=True) niet werkt, maar 2 cursor.execute(sql) wel?

  2. ScaleGrid op shortlist voor 2017-2018 Cloud Awards-programma

  3. Objecten uit query verwijderen indien Geen of Null

  4. Hoe verplaats ik een tabel naar een schema in T-SQL