ORA-01427: 单行子查询返回多于一个行,请教高手:怎么改?

ORA-01427: 单行子查询返回多于一个行,请教高手:怎么改?,第1张

在update的时候,子查询返回是多条,你首先必须要确定怎么从这多条里面选择一条出来,比如你可以选最大的select max(lngactivitydetailid27) 最小的select min(lngactivitydetailid27),当然也可以选第一条出来,改完的句子类似于:
update itemactivitydetail id
set idlngorderdetailid = (select max(lngactivitydetailid27)
from (select id1lngactivityid,
id1lngactivitydetailid,
id1lngitemid
from itemactivity i1,
itemactivitydetail id1
where i1lngactivityid =
id1lngactivityid
and i1lngactivitytypeid = 28
and id1lngorderdetailid = 0) a28,
(select id2lngitemid,
i2lngorderactivityid,
id2lngactivitydetailid as lngactivitydetailid27
from itemactivity i2,
itemactivitydetail id2
where i2lngactivityid =
id2lngactivityid
and i2lngactivitytypeid = 27) a27
where a28lngitemid = a27lngitemid
and a28lngactivityid =
a27lngorderactivityid
and a28lngactivitydetailid =
idlngactivitydetailid
and rownum <=1)
where exists
(select 1
from (select id1lngactivityid,
id1lngactivitydetailid,
id1lngitemid
from itemactivity i1, itemactivitydetail id1
where i1lngactivityid = id1lngactivityid
and i1lngactivitytypeid = 28
and id1lngorderdetailid = 0) a28,
(select id2lngitemid,
i2lngorderactivityid,
id2lngactivitydetailid as lngactivitydetailid27
from itemactivity i2, itemactivitydetail id2
where i2lngactivityid = id2lngactivityid
and i2lngactivitytypeid = 27) a27
where a28lngitemid = a27lngitemid
and a28lngactivityid = a27lngorderactivityid
and a28lngactivitydetailid = idlngactivitydetailid)

找每个子查询的主键,只要主键没有完全包含在子查询的WHERE子句中,就有可能发生该错误。另外你可以在WHERE子句中添加and rownum<=1来解决。
不过最好还是查清原因再考虑解决方案,因为说不定就是你漏掉了某些主键条件

update table1 a set (a,b)=(select ba,bb
from table2 b where apk=bpk ) where +需要的条件
这样就可以了

nvl是一个标量函数,在你的SQL语句中,nvl第一个参数是一个子查询。而该子查询是按日期统计用户登录的次数(group by triqi),如果查询范围在一天之内,因为triqi就是一个值,子查询的结果集中只有一条记录,是没有问题的;而如果查询的日期范围超出1天,且有用户在不同的日期有登录,那么子查询的结果集将会有多个记录。这样,nvl函数的第一个参数就是一个多值的结果集,而不是一个单值的结果集,就发生ORA-01427的错误了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13321047.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-14
下一篇 2023-07-14

发表评论

登录后才能评论

评论列表(0条)

保存