我想更新一个表中的列,在其他表上进行连接,例如:
UPDATE table1 a
INNER JOIN table2 b ON a.commonfield = b.[common field]
SET a.CalculatedColumn= b.[Calculated Column]
WHERE
b.[common field]= a.commonfield
AND a.BatchNO = '110'
但它抱怨:
消息170,级别15,状态1,行2第2行:'a'附近的语法不正确 .
这有什么不对?
10 回答
试试这样:
(编辑:错误拼写!)
亚伦上面给出的答案是完美的:
只是想在我们尝试在更新该表时使用表的别名时添加为什么在SQL Server中出现此问题,下面提到的语法总是会给出错误:
如果要更新单个表或使用join进行更新,则case可以是any .
虽然上面的查询在PL / SQL中可以正常工作,但在SQL Server中却不行 .
在SQL Server中使用表别名时更新表的正确方法是:
希望它能帮助每个人为什么错误来到这里 .
尝试:
似乎SQL Server 2012也可以处理Teradata的旧更新语法:
如果我没记错的话,当我尝试类似查询时,2008R2会出错 .
另一种方法是使用MERGE
-Merge是SQL Standard的一部分
我有同样的问题..你不需要添加一个物理列..因为现在你必须维护它..你可以做的是在select查询中添加一个通用列:
EX:
你没有't quite have SQL Server'的专有
UPDATE FROM
语法 . 也不确定为什么你需要加入CommonField
并在之后过滤它 . 试试这个:如果您正在做一些非常愚蠢的事情 - 比如不断尝试将一列的值设置为另一列的聚合(这违反了避免存储冗余数据的原则),您可以使用a CTE (common table expression):
这真的很愚蠢的原因是,每当
table2
中的任何一行发生变化时,你都必须重新运行整个更新 .SUM
是您可以随时在运行时计算的东西,在这样做时,永远不必担心结果是陈旧的 .更多替代方案:http://www.karlrixon.co.uk/writing/update-multiple-rows-with-different-values-and-a-single-sql-query/
我发现在更新之前将UPDATE转换为SELECT以获取我想要更新的行作为测试是有用的 . 如果我可以选择我想要的确切行,我可以只更新我想要更新的行 .