我想把表table1的一列val1中的所有值复制到另一个表table2的一列val2中。
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
有没有别的办法?
bf1o4zei1#
您的UPDATE查询应如下所示:
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列表中(表、子查询、返回集合的函数等)。
table2_id
FROM
table2.val2
SELECT
一米十一分一秒
允许其他表中的列出现在WHERE条件和更新表达式中的表表达式。它使用与SELECT语句的FROM子句相同的语法;例如,可以指定表名的别名。不要将目标表重复为***from_item***,除非您打算使用自联接(在这种情况下,它必须在***from_item***中使用别名)。最后的WHERE子句阻止了不会改变任何东西的更新--几乎是完全代价,但没有任何收益(特殊的例外情况适用)。如果旧值和新值都保证是NOT NULL,简化为:
WHERE
from_item
NOT NULL
AND t2.val2 <> t1.val1
请参阅:
guykilcj2#
更新表1,从表2中设置表1_列=表2.列表2,其中表1_id = table2.id1.不要为table1使用别名。1.表为表1、表2
2条答案
按热度按时间bf1o4zei1#
您的
UPDATE
查询应如下所示:按照您的方式,两个表的各行之间没有任何链接。对于
table2
中的每一行,都将从table1
中提取每一行。这毫无意义(代价高昂),并且还会触发语法错误,因为此处的子查询表达式只允许返回单个值。我通过连接
table2_id
上的两个表修复了这个问题。我重写了
UPDATE
,以在table1
中进行连接(使用FROM
子句),而不是运行相关子查询,因为这样通常更快。它还可以防止在
table1
中找不到匹配行时table2.val2
被置为空。相反,使用这种形式的查询时,这些行 * 不会 * 发生任何变化。您可以像在普通的
SELECT
中一样将表表达式添加到FROM
列表中(表、子查询、返回集合的函数等)。一米十一分一秒
允许其他表中的列出现在
WHERE
条件和更新表达式中的表表达式。它使用与SELECT
语句的FROM
子句相同的语法;例如,可以指定表名的别名。不要将目标表重复为***from_item
***,除非您打算使用自联接(在这种情况下,它必须在***from_item
***中使用别名)。最后的
WHERE
子句阻止了不会改变任何东西的更新--几乎是完全代价,但没有任何收益(特殊的例外情况适用)。如果旧值和新值都保证是NOT NULL
,简化为:请参阅:
guykilcj2#
更新表1,从表2中设置表1_列=表2.列表2,其中表1_id = table2.id
1.不要为table1使用别名。
1.表为表1、表2