我想所有的值从一个复制val1
一个表table1
一列val2
另一个表的table2
。 我在PostgreSQL的尝试下面的命令:
update table2
set val2 = (select val1 from table1)
但我得到这个错误:
错误:由用作表达子查询返回了多个行
是否有其他要做到这一点?
我想所有的值从一个复制val1
一个表table1
一列val2
另一个表的table2
。 我在PostgreSQL的尝试下面的命令:
update table2
set val2 = (select val1 from table1)
但我得到这个错误:
错误:由用作表达子查询返回了多个行
是否有其他要做到这一点?
你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
子句防止不会改变什么更新-这实际上总是一个好主意(全部费用,但没有收获-异国情调的例外情况)。 更新表1组table1_column =从表2表2 table2.column其中table1_id = table2.id