【发布时间】:2021-01-08 17:35:49
【问题描述】:
我发现了一些奇怪的东西
Update **X** SET field = 'bla'
from **X**
..这真的没有意义
【问题讨论】:
标签: sql sql-server syntax sql-update
我发现了一些奇怪的东西
Update **X** SET field = 'bla'
from **X**
..这真的没有意义
【问题讨论】:
标签: sql sql-server syntax sql-update
这种通用语法通常用于在更新时连接表(即,您希望根据表 t2 中的列 c2 更新表 t1 中的列 c1)。一般为
UPDATE
t1
SET
t1.c1 = t2.c2, -- Just an example
t1.c3 = 'something else' -- etc...
FROM
t1
[INNER | LEFT] JOIN t2 ON join_condition
在您的示例中,您没有 join 子句,因此它可能看起来有点滑稽,但正如您所指出的,这是有效的语法。
【讨论】:
首先要了解的是UPDATE 语句也可能使用JOIN 等功能,其中存在多个表。所以你可以有这样的东西:
UPDATE X
SET col1 = Y.colA
FROM X
INNER JOIN Y ON X.col2 = y.colB
现在我们涉及到两个表,所以UPDATE 旁边的X 告诉我们我们要定位哪个表。
当然,我们仍然更喜欢 X.col1 而不是 SET 子句中的 col1。进行更改,UPDATE 关键字旁边的 X 似乎又是多余的。但是,在同一语句中定位两个表是不合法的。因此,UPDATE 旁边的 X 告诉服务器哪些引用是 SET 子句中的合法目标。它在使用别名时特别有用(你几乎应该总是这样做):
UPDATE x
SET x.col1 = y.colA, x.col3 = y.colC
FROM VeryLongTableNameA x
INNER JOIN VeryLongTableNameB y ON x.col2 = y.colB
从技术上讲,您可以仍然简化语言以删除UPDATE 旁边的X。查询编译器可以根据SET 子句推断目标,多个或不明确的目标将无法编译,从而产生语法错误。但这不是语言的工作方式。当您希望完整的查询通常在个位数毫秒内完成时,让编译器稍微轻松一点确实是有价值的。
【讨论】:
什么没有意义?
这是X 上的update 声明。 update x 中的X 实际上是from 子句定义的表别名。
【讨论】: