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

Coy*_*ero 17 sql t-sql sql-server

我正在使用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
Run Code Online (Sandbox Code Playgroud)

给出错误消息:

无法绑定多部分标识符"A.ORG_NAME".

错误消息是什么意思?

jaz*_*ato 32

您无法在单个语句中更新一个表,但是您获得的错误消息是由于别名,您可以尝试这样做:

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
Run Code Online (Sandbox Code Playgroud)

  • *BEGIN TRANSACTION*与启动块的*BEGIN*不同(例如,在*IF*中使用).所以不要使用*END*,这不是一个好的或坏的练习问题,你可能会关闭你所在的块并发现意外的输出 (4认同)

Eri*_*ski 15

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

UPDATE table1 
SET table1.name = table2.name 
FROM table1, table2 
WHERE table1.id = table2.id 
AND table2.foobar ='stuff'
Run Code Online (Sandbox Code Playgroud)

但是您尝试使用连接多个表的更新语句来影响多个表.这是不可能的.

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

SQL JOINS

但这是一个真正的hacky客厅技巧,使用事务和多个更新,它更直观.

  • 你的粗体陈述并不完全正确.您可以根据连接更新表,您只能拥有更新*影响*多个表.我同意建议链接的黑客行为(我甚至建议删除它).是否真的值得做所有这些以避免写两个陈述? (3认同)