在 SQL Server 中使用 JOIN 更新表?
我想更新表中的一列,与其他表进行连接,例如:
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”附近的语法不正确。
这里有什么问题吗?
I want to update a column in a table making a join on other table e.g.:
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'
But it is complaining :
Msg 170, Level 15, State 1, Line 2
Line 2: Incorrect syntax near 'a'.
What is wrong here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
您还没有完全掌握 SQL Server 专有的
UPDATE FROM
语法。也不知道为什么您需要加入CommonField
并随后对其进行过滤。试试这个:如果你正在做一些愚蠢的事情 - 比如不断尝试将一列的值设置为另一列的聚合(这违反了避免存储冗余数据的原则),你可以使用 CTE(公用表表达式) -请参阅此处和此处 了解更多详细信息:
这很愚蠢,因为您每次都必须重新运行整个更新
table2
中的行发生更改。SUM
是您始终可以在运行时计算的东西,这样做时,永远不必担心结果是陈旧的。You don't quite have SQL Server's proprietary
UPDATE FROM
syntax down. Also not sure why you needed to join on theCommonField
and also filter on it afterward. Try this:If you're doing something silly - like constantly trying to set the value of one column to the aggregate of another column (which violates the principle of avoiding storing redundant data), you can use a CTE (common table expression) - see here and here for more details:
The reason this is silly, is that you're going to have to re-run this entire update every single time any row in
table2
changes. ASUM
is something you can always calculate at runtime and, in doing so, never have to worry that the result is stale.试试这样:
Try it like this:
Aaron 上面给出的答案是完美的:
只是想添加为什么当我们在更新该表时尝试使用表的别名时,在 SQL Server 中会出现此问题,下面提到的语法将始终给出错误:
如果您正在更新一个表,则可以是任何情况单个表或使用连接时更新。
虽然上面的查询在 PL/SQL 中可以正常工作,但在 SQL Server 中却不行。
在 SQL Server 中使用表别名更新表的正确方法是:
希望它能帮助大家为什么会出现错误。
Answer given above by Aaron is perfect:
Just want to add why this problem occurs in SQL Server when we try to use alias of a table while updating that table, below mention syntax will always give error:
case can be any if you are updating a single table or updating while using join.
Although above query will work fine in PL/SQL but not in SQL Server.
Correct way to update a table while using table alias in SQL Server is:
Hope it will help everybody why error came here.
更多替代方案 这里。
More alternatives here.
似乎 SQL Server 2012 也可以处理 Teradata 的旧更新语法:
如果我没记错的话,当我尝试类似的查询时,2008R2 给出了错误。
Seems like SQL Server 2012 can handle the old update syntax of Teradata too:
If I remember correctly, 2008R2 was giving error when I tried similar query.
我发现将 UPDATE 转换为 SELECT 以获得我想要更新的行作为更新之前的测试很有用。如果我可以选择我想要的确切行,我就可以只更新我想要更新的那些行。
I find it useful to turn an UPDATE into a SELECT to get the rows I want to update as a test before updating. If I can select the exact rows I want, I can update just those rows I want to update.
另一种方法是使用 MERGE
-Merge 是 SQL 标准的一部分
-而且我很确定内部联接更新是不确定的。
类似的问题在这里,答案谈到了这一点
http://ask.sqlservercentral.com/questions /19089/updating-two-tables-using-single-query.html
Another approach would be to use MERGE
-Merge is part of the SQL Standard
-Also I'm pretty sure inner join updates are non deterministic..
Similar question here where the answer talks about that
http://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-query.html
我想,这就是您正在寻找的。
I think, this is what you are looking for.
我遇到了同样的问题..并且您不需要添加物理列..因为现在您必须维护它..
您可以做的是在选择查询中添加通用列:
EX:
I had the same issue.. and you don't need to add a physical column.. cuz now you will have to maintain it..
what you can do is add a generic column in the select query:
EX:
亚伦的上述方法对我来说非常有效。我的更新语句略有不同,因为我需要根据一个表中连接的两个字段进行连接,以匹配另一个表中的字段。
Aaron's approach above worked perfectly for me. My update statement was slightly different because I needed to join based on two fields concatenated in one table to match a field in another table.
使用MYSQL的人
Those who are using MYSQL
尝试:
Try: