执行SQL UPDATE语句报1242错误(子查询返回多行)如何解决
错误原因
- WHERE子句后直接放置了返回多行结果的子查询,没有搭配
IN/EXISTS这类可处理多行结果的操作符:数据库执行WHERE条件时需要得到布尔值判断结果,但你的子查询返回了多个符合条件的商品ID,无法直接转换为布尔值,因此触发1242错误。 - 存在隐性逻辑问题:子查询内部使用的
product表和外层UPDATE的product表重名,会出现标识符作用域混淆问题,即使补全操作符也可能出现执行结果不符合预期的情况。
修复方案
以下两种写法均可以实现需求,可根据数据规模和性能偏好选择:
写法1:IN子查询(逻辑直观,适合小数据量场景)
UPDATE product SET bio = 'bio-plant' WHERE Id_Product IN ( SELECT DISTINCT pha.Id_Product FROM product_has_additions pha WHERE pha.code IN ('E170', 'E220', 'E296', 'E300', 'E306', 'E322', 'E330', 'E333', 'E334', 'E335', 'E336', 'E341', 'E392', 'E400', 'E401', 'E402', 'E406', 'E407', 'E410', 'E412', 'E414', 'E415', 'E422', 'E440', 'E464') );
说明:子查询不需要额外关联product表,直接从关联表取符合条件的商品ID即可,避免表重名问题。
写法2:EXISTS关联查询(性能更优,适合大数据量场景)
UPDATE product p SET bio = 'bio-plant' WHERE EXISTS ( SELECT 1 FROM product_has_additions pha WHERE pha.Id_Product = p.Id_Product AND pha.code IN ('E170', 'E220', 'E296', 'E300', 'E306', 'E322', 'E330', 'E333', 'E334', 'E335', 'E336', 'E341', 'E392', 'E400', 'E401', 'E402', 'E406', 'E407', 'E410', 'E412', 'E414', 'E415', 'E422', 'E440', 'E464') );
内容的提问来源于stack exchange,提问作者yoggozuna
相关产品推荐
相关产品推荐

