SQL:使用另一个表中的行替换表中的行

时间:2012-08-11 18:08:53

标签: sql postgresql

我有一个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语句,用tableB中的行替换tableA中的所有行(或类似地,将tableB中存在的所有行的enabled字段设置为false)

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

非常感谢。

3 个答案:

答案 0 :(得分:3)

这样做(但语法与MSSQL兼容,thx @ comments):

update tableA
   set tableA.enabled = false
from tableA
    inner join tableB on tableA.rowid = tableB.rowid

答案 1 :(得分:2)

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

UPDATE TableA
SET Enabled = false
WHERE rowid IN
(SELECT rowid FROM TableB)

答案 2 :(得分:1)

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语句不仅更优雅,而且比使用{{ 1}}。对于小的更新来说几乎不重要,但是对于大的更新可能会很重要。使用EXPLAIN ANALYZE进行测试。

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