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

时间:2017-07-26 11:07:28

标签: sql sql-server sql-server-2008

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

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

2 个答案:

答案 0 :(得分:2)

使用内连接,差异只是语义差异。两个查询都应该生成完全相同的查询计划和完全相同的结果。

但是,当您使用外连接时,如果条件在where子句或on 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,它是' s基本上将右连接更改为内连接。

答案 1 :(得分:1)

在WHERE子句或ON子句中放置过滤谓词之间是否有区别仅取决于您正在进行的JOIN类型。对于内连接,没有区别。对于外连接,将谓词放在ON子句中可能意味着您不必在WHERE子句中编写OR xxx IS NULL

实施例。这两个查询的功能相同:

SELECT *
FROM
  a
  LEFT OUTER JOIN
  b
  ON
    a.id = b.id AND
    b.type = 'circle'

SELECT *
FROM
  a
  LEFT OUTER JOIN
  b
  ON
    a.id = b.id
WHERE
    b.type = 'circle' OR b.id IS NULL

如果A中有一行没有B中的相应行,则省略第二个查询中的OR b IS NULL可能会导致某些行从结果中消失