我有两个更新语句。它们都提供相同的输出。它们如何不同,哪种更好用?
声明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())
答案 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
可能会导致某些行从结果中消失