我想在一个表中更新一个列,在其他表上进行连接,例如:
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'附近的语法错误。
这里出了什么问题?
另一种方法是使用MERGE
;WITH cteTable1(CalculatedColumn, CommonField)
AS
(
select CalculatedColumn, CommonField from Table1 Where BatchNo = '110'
)
MERGE cteTable1 AS target
USING (select "Calculated Column", "Common Field" FROM dbo.Table2) AS source ("Calculated Column", "Common Field")
ON (target.CommonField = source."Common Field")
WHEN MATCHED THEN
UPDATE SET target.CalculatedColumn = source."Calculated Column";
-Merge是SQL标准的一部分
-我也很确定内部连接更新是不确定的。
类似的问题,答案是这样说的
http://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-query.html
Aaron给出的答案是完美的:
UPDATE a
SET a.CalculatedColumn = b.[Calculated Column]
FROM Table1 AS a
INNER JOIN Table2 AS b
ON a.CommonField = b.[Common Field]
WHERE a.BatchNo = '110';
只是想补充一下为什么在SQL Server中,当我们在更新表时尝试使用表的别名时,会出现这个问题,下面提到的语法总是会给出错误:
update tableName t
set t.name = 'books new'
where t.id = 1
如果您正在更新单个表或在使用连接进行更新,则Case可以是任何。
虽然上面的查询在PL/SQL中可以很好地工作,但在SQL Server中不行。
在SQL Server中使用表别名更新表的正确方法是:
update t
set t.name = 'books new'
from tableName t
where t.id = 1
希望它能帮助大家为什么错误会出现在这里。