2012-04-04 72 views
3
UPDATE table1 
SET col = 1 
WHERE col2 = 'xyz' 


UPDATE a 
SET col = 1 
FROM table1 a 
WHERE col2 = 'xyz' 

哪个是首选?这两个简单的SQL Update语句有什么区别吗?

我可以发现的一个区别是第二个语句允许在'FROM'语句附近使用WITH NO LOCK。但是,在更新语句附近使用时,它会提供与第一条语句相同的错误消息。

对于INSERT,UPDATE或DELETE语句的目标表,不允许使用NOLOCK和READUNCOMMITTED锁提示。

感谢这么多

+3

您的具体示例没有差别。迄今给出的答案提到了联接的可能性。但应该警告,连接可能会很危险 - 如果连接的结果意味着目标表中的一行已经从其他表中连接到* multiple *行,并且更新基于其他表中的值实际上用于执行更新的行是不确定的。 – 2012-04-04 08:23:07

回答

3

它们是相同的。

如果UPDATE语句只涉及访问一个表,第一个更清洁/更简单。

如果您需要做一个JOIN,然后指定你的每第二个示例的别名(IMO)清洁剂,如:

UPDATE a 
SET a.Col = 1 
FROM TableA a 
    JOIN TableB b ON a.Id = b.Id 
WHERE b.Something = '123' 

顺便说一句,有没有点指定表上的NOLOCK提示更新,所以不要指望,作为一个一个在另一个之上的原因。

+0

更新时将忽略UPDATED表上的+1(NOLOCK)(将在已连接的表上执行)。 sp_lock在SQL 2008上没有任何区别。 – StuartLC 2012-04-04 08:40:28

3

您可以使用FROM语法,如果你需要或者如果它是有信心(在你的例子一样)使用别名或连接的像这样的:

UPDATE a 
SET col = 1 
FROM table1 a 
INNER JOIN table2 b ON b.id = a.bid 
WHERE b.col = 'x' 
2

其中常见的使用方法2的场景是,如果您需要根据连接表上的过滤器进行更新,例如

UPDATE a 
SET a.col = 1 
FROM table1 a inner join table2 b on a.someFK = b.somePK 
WHERE a.col2 = 'xyz' and b.col3 = 'abc' 
1

两者都很好,但这取决于你需要什么。

第一个示例更简单,但不允许您使用其他表中的值。

如果您必须使用其他表中的值才能更新您的表,如Mulmoth所示,示例2非常有用。