3
UPDATE table1
SET col = 1
WHERE col2 = 'xyz'


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

哪个是首选?

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

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

非常感谢

4

4 回答 4

3

如果您需要,或者如果您有信心使用别名(如您的示例中)或像这样的 JOIN,则可以使用 FROM 语法:

UPDATE a
SET col = 1
FROM table1 a
INNER JOIN table2 b ON b.id = a.bid
WHERE b.col = 'x'
于 2012-04-04T08:20:06.467 回答
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 提示是没有意义的,因此不要将其视为一个原因。

于 2012-04-04T08:21:21.423 回答
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'
于 2012-04-04T08:20:24.220 回答
1

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

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

如果您必须使用其他表中的值来更新您的表,示例 2 非常有用,就像 Mulmoth 所演示的那样。

于 2012-04-04T08:24:13.017 回答