使用单SELECT更新多行时触发多行返回错误,求问题排查
UPDATE语句触发“单SELECT返回多行”错误的原因与解决
错误根源很明确:你用来给IT.BCOST赋值的子查询,对于ITEMS表中的部分记录,在VENDOR表中匹配到了多条相同ITEMNO的记录,导致子查询返回多个结果。而SET子句要求赋值的子查询必须只能返回单个值,因此触发了这个报错。
解决方法分三种情况:
- 若只需取匹配记录中的某类价格(如最高、最低、平均),用聚合函数限定返回单值:
UPDATE ITEMS IT SET IT.BCOST = (SELECT MAX(V.PRICE + (V.PRICE * 0.1)) -- 替换为MIN/AVG也可 FROM VENDOR V WHERE V.ITEMNO = IT.ITEMNO) WHERE EXISTS (SELECT 1 FROM VENDOR V WHERE V.ITEMNO = IT.ITEMNO) - 若业务逻辑里
VENDOR表同一个ITEMNO应该只有一条记录,先清理重复数据,或者给VENDOR表的ITEMNO字段添加唯一约束,从根源避免重复。 - 若需要基于每个
VENDOR的记录更新(需确认业务逻辑合理性),改用关联更新的写法:UPDATE ITEMS IT JOIN ( SELECT ITEMNO, PRICE + (PRICE * 0.1) AS ADJUSTED_PRICE FROM VENDOR -- 若有重复,此处可添加聚合或过滤条件,比如取最新创建的记录 ) V ON IT.ITEMNO = V.ITEMNO SET IT.BCOST = V.ADJUSTED_PRICE
内容的提问来源于stack exchange,提问作者Henry Olive
相关产品推荐
相关产品推荐

