在PostgreSQL中使用另一个表的列更新一个表的列

cedebl8k  于 2022-12-12  发布在  PostgreSQL
关注(0)|答案(2)|浏览(293)

我想把表table1的一列val1中的所有值复制到另一个表table2的一列val2中。

update table2
set val2 = (select val1 from table1)

但我得到了这个错误:

ERROR:  more than one row returned by a subquery used as an expression

有没有别的办法?

bf1o4zei

bf1o4zei1#

您的UPDATE查询应如下所示:

UPDATE table2 t2
SET    val2 = t1.val1
FROM   table1 t1
WHERE  t2.table2_id = t1.table2_id
AND    t2.val2 IS DISTINCT FROM t1.val1;  -- optional, see below

按照您的方式,两个表的各行之间没有任何链接。对于table2中的每一行,都将从table1中提取每一行。这毫无意义(代价高昂),并且还会触发语法错误,因为此处的子查询表达式只允许返回单个值。
我通过连接table2_id上的两个表修复了这个问题。
我重写了UPDATE,以在table1中进行连接(使用FROM子句),而不是运行相关子查询,因为这样通常更快。
它还可以防止在table1中找不到匹配行时table2.val2被置为空。相反,使用这种形式的查询时,这些行 * 不会 * 发生任何变化。
您可以像在普通的SELECT中一样将表表达式添加到FROM列表中(表、子查询、返回集合的函数等)。

一米十一分一秒

允许其他表中的列出现在WHERE条件和更新表达式中的表表达式。它使用与SELECT语句的FROM子句相同的语法;例如,可以指定表名的别名。不要将目标表重复为***from_item***,除非您打算使用自联接(在这种情况下,它必须在***from_item***中使用别名)。
最后的WHERE子句阻止了不会改变任何东西的更新--几乎是完全代价,但没有任何收益(特殊的例外情况适用)。如果旧值和新值都保证是NOT NULL,简化为:

AND   t2.val2 <> t1.val1

请参阅:

  • 如何(或可以)对多个列执行SELECT DISTINCT操作?
guykilcj

guykilcj2#

更新表1,从表2中设置表1_列=表2.列表2,其中表1_id = table2.id
1.不要为table1使用别名。
1.表为表1、表2

相关问题