correlated update报错‘single-row subquery returns more than one row’的修正方案
修正关联更新中的“单行子查询返回多行”错误
嘿,我来帮你搞定这个问题!你遇到的single-row subquery returns more than one row错误,根源在于你写的子查询没有和当前要更新的my_table行做一对一绑定——它直接把两个表全连接后返回所有匹配的a_value,数据库当然不知道该选哪个值给当前行啦。
下面给你两种靠谱的修正方案,都能达到你想要的效果:
方案1:带行级关联的子查询
这种写法让子查询只针对当前更新的my_table行,返回对应OrderID的单个a_value,同时用EXISTS确保只更新有匹配数据的行:
UPDATE my_table SET my_value = ( SELECT a_value FROM result_table WHERE result_table.OrderID = my_table.OrderID ) WHERE EXISTS ( SELECT 1 FROM result_table WHERE result_table.OrderID = my_table.OrderID );
- 子查询里的
result_table.OrderID = my_table.OrderID是关键,它会锁定当前行对应的匹配数据,保证每次只返回单行; - 如果你的需求允许没有匹配的行保持
my_value为NULL,可以去掉后面的WHERE EXISTS部分。
方案2:使用UPDATE JOIN(更简洁高效)
如果你的数据库支持UPDATE JOIN(比如MySQL、PostgreSQL等),这种写法更直观,直接通过关联两个表完成批量更新:
UPDATE my_table JOIN result_table ON my_table.OrderID = result_table.OrderID SET my_table.my_value = result_table.a_value;
这种方式不需要子查询,直接通过JOIN建立两行的对应关系,一次性完成所有匹配行的更新,效率也更高。
不管用哪种方案,执行后你的my_table都会变成你期望的样子:
OrderID my_volume my_value
1 100 2000
2 50 3500
内容的提问来源于stack exchange,提问作者Matin
相关产品推荐
相关产品推荐

