我有一个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语句也是受欢迎的。
非常感谢。
答案 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
。我引用:不要在目标规范中包含表的名称 列 - 例如,
UPDATE tab SET tab.col
= 1无效。
在PostgreSQL中,将另一个表加入带有 UPDATE
子句的FROM
语句不仅更优雅,而且比使用{{ 1}}。对于小的更新来说几乎不重要,但是对于大的更新可能会很重要。使用EXPLAIN ANALYZE
进行测试。
最后但并非最不重要的是,对于任何RDBMS:避免空更新。如果表A中的行已经关闭,请不要应用更新。它不会更改数据,但仍然会创建一个死行,可能会导致触发器触发并降低性能和磁盘空间。