小弟 刚学oracle 写了批量更新提示 单行子查询返回多行 那位高手能不能帮忙改下吗

这个是语句
update xs0701 x set x.SSXWZS=(select a.ssxwzs from (select xs0701_lsb.ssxwzs,xs0101.xs0101id from xs0701_lsb,xs0101 where xs0701_lsb.xh=xs0101.xh) a where a.xs0101id=x.xs0101id )

“单行子查询返回多行”的错误修改不在于SQL语句的语法,而在于数据。“单行子查询返回多行”的意思就是说:本来应该用查询结果中的唯一一行数据结果去更新你要更新的原始的一行数据,但是查询结果却返回了多行数据,此时数据库不知道该使用这多行查询结果中的哪一行数据去更新你的原始数据,此时数据库就会报错:单行子查询返回多行。
基于上述原理,解决这个问题的关键在于你要理清楚数据间的业务逻辑关系,保证查询结果是按照主键查询的,即保证查询结果是惟一的一行数据。如果在某种特殊业务场景下就是需要从多行结果中选择任意一行来更新原始数据那么也可以在子查询中增加rownumber = 1,也就是说从查询的结果集中任意取其中一行更新原始数据。
update xs0701 x set x.SSXWZS=(select a.ssxwzs from (select xs0701_lsb.ssxwzs,xs0101.xs0101id from xs0701_lsb,xs0101 where xs0701_lsb.xh=xs0101.xh) a where a.xs0101id=x.xs0101id and rownumber = 1)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-24
1.确认xs0701是否有重复的xs0101id。
2.若xs0701的xs0101id无重复情况,则确认以下查询是否有重复的xs0101id。
select xs0701_lsb.ssxwzs, xs0101.xs0101id from xs0701_lsb, xs0101 where xs0701_lsb.xh = xs0101.xh
若有重复记录,就需要楼主考虑业务情况看看了。
3.若简单的加个distinct可排除重复记录,总之要确保x表和a表的xs0101id是一一对应的,参考语句如下:
update xs0701 x
set x.SSXWZS =
(select a.ssxwzs
from (select distinct xs0701_lsb.ssxwzs, xs0101.xs0101id
from xs0701_lsb, xs0101
where xs0701_lsb.xh = xs0101.xh) a
where a.xs0101id = x.xs0101id)本回答被提问者采纳
相似回答