使用一个 WHERE 子句更新多个表

Posted

技术标签:

【中文标题】使用一个 WHERE 子句更新多个表【英文标题】:UPDATE to multiple tables with one WHERE clause 【发布时间】:2020-11-02 17:27:58 【问题描述】:

我需要使用相同的 WHERE 子句更新两个表。 WHERE 子句有数百个 ID,所以我想避免像这样写两次...

UPDATE TABLE1
SET (values...)
WHERE ID in (list of IDs)

UPDATE TABLE2
SET (values...)
WHERE ID in (list of IDs)  -- this is the same statement as above

有没有办法将这些与一个 WHERE 语句合并?

【问题讨论】:

否 - 一条更新语句只会直接更新一张表。将您的 ID 放入临时表(或表变量)中,然后加入更新。 这能回答你的问题吗? How to update two tables in one statement in SQL Server 2005? 根据链接的 SO 答案,请确保将更新语句包装在 transaction 中,以便在部分原因因任何原因失败时回滚 update 【参考方案1】:

SQL Server 不支持多表更新。

但是,您可以将这些 id 放在一个表中,然后在查询中使用。

create table id_table (id int);  -- or whathever datatype you need
insert into id_table (id) values (1), (2), ...; -- list of ids

然后:

update t
set ...
from table1 t
where exists (select 1 from id_table i where i.id = t.id)

【讨论】:

【参考方案2】:

您不能在 SQL Server 中真正做到这一点。最好的办法是创建一个临时表:

select *
into toupdate
from values ( . . . ) v(id)

然后您可以在delete 语句中使用它:

update table1
    set . . .
    where id in (select id from toupdate);

【讨论】:

你的意思是我“不能”真的做到吗?而且更新不删除对吧?

以上是关于使用一个 WHERE 子句更新多个表的主要内容,如果未能解决你的问题,请参考以下文章

使用 where exists 子句更新多个值

使用多个 WHERE 子句更新 Codeigniter 中的批处理

使用不同的where子句更新多个列

如何使用 Where 子句从多个表中删除多行?

使用 WHERE 子句加入多个表,包括没有公共 ID 的行

如何使用引用多个表的 WHERE 子句删除 sqlite 中的行?