我有两个更新语句。他们两个都给出相同的输出。它们有何不同,哪种更好使用?
陈述1:
UPDATE li SET li.Description = im.Description FROM tbSupplierLineItem li JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode WHERE li.ProcessedDate >= CONVERT(DATE,GETDATE())
陈述2:
UPDATE li SET li.Description = im.Description FROM tbSupplierLineItem li JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode AND li.ProcessedDate >= CONVERT(DATE,GETDATE())
对于内部连接,差异只是语义上的差异。这两个查询应产生完全相同的查询计划和完全相同的结果。
但是,当您使用外部联接时,条件是否在where子句或onon子句上就很重要。
where
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())
不同于
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())
不仅在语义层面上。 虽然第一个查询将返回右连接的预期结果,但第二个查询实际上将返回内部连接的预期结果。 这是因为如果您在左表上有不匹配的记录,那么右表的值可能为null,并且由于将任何值与null(包括另一个null)进行比较都会导致结果为false,因此基本上是将右连接更改为内部联接。