0

我有一个 SQL 问题。

我有两个表:tableA 和 tableB。这两个表的结构完全相同(简化版):

rowid : big int
name: character varying
enabled : boolean

两张表:

tableA contains all the data and their enabled columns are all true.
tableB contains data in tableA that should be turned off (enabled set to false).

我的问题是如何编写一个 SQL 语句,将 tableA 中的所有行替换为 tableB 中的行(或者类似地,将 tableB 中存在的所有行的启用字段设置为 false)

我使用 PostgreSQL。也欢迎来自其他 SQL 类型的 SQL 语句。

非常感谢。

4

3 回答 3

3

这会做(但语法与 MSSQL 兼容,谢谢@评论):

update tableA
   set tableA.enabled = false
from tableA
    inner join tableB on tableA.rowid = tableB.rowid
于 2012-08-11T18:12:13.573 回答
2
UPDATE tbl_a a
SET    enabled = FALSE
FROM   tbl_b b
WHERE  a.rowid = b.rowid
AND    a.enabled IS NOT FALSE;

如果enabled定义NOT NULL简化为:

AND a.enabled;

不要在目标列的规范中包含表的名称——例如,UPDATE tab SET tab.col= 1 是无效的。

  • 在 PostgreSQL 中,使用子句将另一个表连接到UPDATE语句FROM不仅更优雅,而且比使用IN (subselect). 小更新几乎不重要,但大更新可能会变得很重要。用 测试EXPLAIN ANALYZE

  • 最后但并非最不重要的一点是,对于任何 RDBMS:避免空更新。如果表 A 中的行已关闭,则不要应用更新。它不会更改数据,但仍会创建死排,可能会导致触发器触发并降低性能和磁盘空间。

于 2012-08-11T23:45:11.313 回答
2

有很多方法可以实现这一目标。尝试:

UPDATE TableA
SET Enabled = false
WHERE rowid IN
(SELECT rowid FROM TableB)
于 2012-08-11T18:11:41.157 回答