使用INNER JOIN在SQL Server中更新多个表

38
我是一个有用的助手,可以翻译文本。
我正在使用SQL Server,并尝试使用SQL一次性更新多个表:
以下是查询语句:
update table1
set A.ORG_NAME =  @ORG_NAME, B.REF_NAME = @REF_NAME
from table1 A, table2 B
where B.ORG_ID = A.ORG_ID
and A.ORG_ID = @ORG_ID

给出了错误信息:

多部分标识符“A.ORG_NAME”无法绑定。

这个错误信息是什么意思?


2
失败的方式是什么?有错误信息吗?或者只是没有更新你想要的内容? - Eli Gassert
5
请不要再使用旧式连接语法,而是使用正确的“INNER JOIN”语法。除了“UPDATE”之外,请停止编写旧式连接语法。https://sqlblog.org/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx - Aaron Bertrand
2个回答

62

您不能在单个语句中更新多个表,但是您收到的错误消息是由于别名,您可以尝试使用以下方法:

BEGIN TRANSACTION

update A
set A.ORG_NAME =  @ORG_NAME
from table1 A inner join table2 B
on B.ORG_ID = A.ORG_ID
and A.ORG_ID = @ORG_ID

update B
set B.REF_NAME = @REF_NAME
from table2 B inner join table1 A
    on B.ORG_ID = A.ORG_ID
    and A.ORG_ID = @ORG_ID

COMMIT

谢谢。在commit之后放置关键字end是一个好的编程习惯吗?还是说不必要呢? - Coyolero
5
BEGIN TRANSACTIONBEGIN不同,BEGIN是用于开始一个块(例如在IF语句中使用)。因此不要使用END,这不仅是良好或不良做法的问题,您可能会关闭当前块并获得意外的输出。 - jazzytomato

25
如果您只影响一个表,可以使用联接更新如下所示:

UPDATE table1 
SET table1.name = table2.name 
FROM table1, table2 
WHERE table1.id = table2.id 
AND table2.foobar ='stuff'

但是,您试图使用一个连接多个表的更新语句来影响多个表。这是不可能的。

然而,在一个语句中更新两个表是可以实现的,但需要创建一个包含要更新的两个表的 UNION 视图。然后,您可以更新该视图,从而更新底层表。

但这是一种巧妙的技巧,请使用事务和多个更新,这更直观。


3
你的粗体声明并不完全正确。你可以基于join更新一个表,只是不能让更新影响多个表。我同意所提供链接的hack-i-ness(笨拙), 我甚至建议移除它。难道为了避免编写两个语句而做这一切真的值得吗? - Aaron Bertrand
该链接没有描述如何使用联合(union),也许那是该博客的另一篇文章? - Bruno Martinez
@BrunoMartinez 你说得对,那个链接的人收到了很多流量(它是一个来自2013年的链接),所以他们改变了内容为一堆可疑的东西。所以我把它删除了。 - Eric Leschinski
这个有文档吗?我已经阅读了“UPDATE”文档,但是没有找到相关内容。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接