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.