2013-02-27 117 views
12

我使用的是SQL Server和尝试使用SQL一次更新多个表用一个查询:更新多个表使用INNER JOIN

下面的查询:

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

失败如何?错误信息?只是没有更新你想要的? – 2013-02-27 15:22:59

+4

'请更新',请不要写旧式连接。使用适当的'INNER JOIN'语法。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx – 2013-02-27 16:08:39

回答

20

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

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 
+0

谢谢。在'commit'后面加上关键字'end'是一个好习惯吗?或者没有必要? – Coyolero 2013-02-27 15:48:53

+3

* BEGIN TRANSACTION *与启动块的* BEGIN *不同(例如,在* IF *中使用)。所以不要使用* END *,这不是一个好的或不好的练习的问题,你可能会关闭你所在的程序块,并找到意想不到的输出 – jazzytomato 2013-02-27 15:55:18

10

您可以用加入,如果更新你只影响一个表像这样:

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

但你试图影响与对多个表的连接更新语句的多个表。这是不可能的。

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

SQL JOINS

但是这是一个非常哈克店招,使用事务和多次更新,它更加直观。

+3

你的粗体语句不完全正确。您可以基于连接来更新表,但您无法更新*影响*多个表。我同意关于建议链接的黑客入侵(我甚至可能会建议删除它)。为避免写两个陈述真的值得做吗? – 2013-02-27 15:50:01

+0

该链接没有描述如何使用联合,也许它是来自该博客的另一篇文章? – 2016-07-20 03:48:49