更新一个表中的列与另一个表的PostgreSQL中柱(Update a column of a ta

2019-07-04 00:36发布

我想所有的值从一个复制val1一个表table1一列val2另一个表的table2 。 我在PostgreSQL的尝试下面的命令:

update table2
set val2 = (select val1 from table1)

但我得到这个错误:

错误:由用作表达子查询返回了多个行

是否有其他要做到这一点?

Answer 1:

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, to avoid empty updates

你有它的方式,有两个表的各行之间没有联系。 每一行将从中获取table1中的每一行table2 。 这样做毫无意义(在昂贵的方式),并且还引发了语法错误,因为在这个地方一个子查询表达式只允许返回一个值。

  • 我通过对连接两个表解决了这个table2_id 。 替换与任何实际的两个环节。

  • 我改写了UPDATE中加入table1 (与FROM子句中),而不是运行的相关子查询,因为这经常快是一个数量级。
    它还防止table2.val2在没有匹配的行被发现将被废止table1 。 取而代之的是, 什么也没有发生这样的行用这种形式的查询。

  • 您可以在所有同样的事情FROM列表中,您可以包括在一个普通的SELECT (如多个表或子查询)。 每文档:

from_list

表表达式的列表,允许来自其它表中的字段出现在WHERE条件和更新表达式。 这类似于可在指定的表列表FROM子句一个的SELECT语句。 请注意,目标表一定不能出现在from_list,除非你打算自连接(在这种情况下,它必须出现在该from_list的别名)。

  • 最后的WHERE子句防止不会改变什么更新-这实际上总是一个好主意(全部费用,但没有收获-异国情调的例外情况)。


Answer 2:

更新表1组table1_column =从表2表2 table2.column其中table1_id = table2.id

  1. 没有为表1使用别名。
  2. 表是表1,表2


文章来源: Update a column of a table with a column of another table in PostgreSQL