使用 INNER JOIN 更新 SQL Server 中的多个表 [重复]

Posted

技术标签:

【中文标题】使用 INNER JOIN 更新 SQL Server 中的多个表 [重复]【英文标题】:Update multiple tables in SQL Server using INNER JOIN [duplicate] 【发布时间】:2013-02-27 15:22:24 【问题描述】:

我正在使用 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”。

错误信息是什么意思?

【问题讨论】:

失败怎么办?错误信息?只是不更新​​你想要的? UPDATE 一边,拜托,拜托,请不要再写旧式联接了。使用正确的INNER JOIN 语法。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/… 【参考方案1】:

你不能在一个语句中更新多个表,但是你得到的错误信息是因为别名,你可以试试这个:

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

【讨论】:

谢谢。将关键字end 放在commit 之后是一个好习惯吗?还是没有必要? BEGIN TRANSACTION 与启动块的 BEGIN 不同(例如在 IF 中使用)。所以不要使用END,这不是一个好坏习惯的问题,你可能会关闭你所在的块并发现意外的输出【参考方案2】:

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

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

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

但是,实际上可以在一个语句中更新两个表,但需要使用包含要更新的两个表的 UNION 创建一个视图。然后您可以更新视图,该视图随后将更新基础表。

但这是一个hacky客厅技巧,使用事务和多次更新,它更直观。

【讨论】:

您的粗体陈述并不完全正确。您可以根据联接更新表,但不能让更新影响 多个表。我同意建议链接的 hack-i-ness(我什至可能建议删除它)。为了避免写两个语句而做所有这些真的值得吗? 该链接没有描述如何使用联合,可能是该博客的另一篇文章? @BrunoMartinez 你是对的,那个链接的人收到了太多的流量(这是 2013 年的链接),他们将内容更改为一堆有问题的东西。所以我删除了它。

以上是关于使用 INNER JOIN 更新 SQL Server 中的多个表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

INNER JOIN与LEFT JOIN在SQL Server的性能

SQL中inner join,outer join和cross join的区别

关于SQL数据库中cross join 和inner join用法上的区别?

带有 SELECT 和 INNER JOIN 的 SQL INSERT INTO

SQL中inner join,outer join和cross join的区别

SQL中inner joinouter join和cross join的区别