小编典典

以下两个更新语句在SQL中有何不同?

sql

我有两个更新语句。他们两个都给出相同的输出。它们有何不同,哪种更好使用?

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

阅读 185

收藏
2021-04-14

共1个答案

小编典典

对于内部连接,差异只是语义上的差异。这两个查询应产生完全相同的查询计划和完全相同的结果。

但是,当您使用外部联接时,条件是否在where子句或onon子句上就很重要。

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,因此基本上是将右连接更改为内部联接。

2021-04-14