求Oracle数据库大神 sql语句报单行查询返回多个行 怎么解决

sql语句是:updateCMS_C_CLOSEINFOoset(BCXY_NUM)=(selecte.bcxy_numfromcms_contract_basic_in... sql语句是:update CMS_C_CLOSEINFO o
set (BCXY_NUM) =
(select e.bcxy_num
from cms_contract_basic_info t
left join (select decode(cmsc.bcxy_num,
'',
cms.contract_number,
cmsc.bcxy_num || ',' || cms.contract_number) bcxy_num,
cms.maincontractid
from cms_contract_basic_info cms,cms_c_closeinfo cmsc
where cmsc.contract_id = cms.maincontractid
and cms.maincontractid is not null) e
on e.maincontractid = t.resourceid, cms_app_operate_info app
where app.app_id = t.resourceid
and t.issign = 'Y'
and (app.flg_deleted is null or app.flg_deleted = 'N')
and app.wfc_status = 'END'
and instr(app.create_company, '天讯') = 0
and t.contractpaytype = '1'
and t.resourceid = o.contract_id)
where exists (select 1
from cms_contract_basic_info t
where t.resourceid = o.contract_id);
COMMIT;
不胜感激!!!!
展开
 我来答
Andy_Sun321
2014-11-15 · TA获得超过1376个赞
知道小有建树答主
回答量:811
采纳率:89%
帮助的人:724万
展开全部
错误的原因在于set (BCXY_NUM) = 后面的那个查询子句,其返回的结果集有不止一条数据,就不能作为单个值赋给BCXY_NUM,故发生错误。
如果单单为了消除错误,你可以给该子查询加一个条件rownum = 1,限制只取一个记录。但是,这样是否符合逻辑,还要看你的具体需求了。
追问
不好意思 现在才回复 如果加一个rownum = 1的话不是只查出一条记录 我要的的是 对于每一个记录 都查出一个bcxy_num来 我要插的不是一条数据啊
追答
看来你尚未清楚update所能更新的数据记录与set后面那个子查询语句的关系:
现在这个SQL语句的主体是一个update更新语句,其能更新多少条记录,更新哪些记录都是由其where条件决定的(就是最后面的那个where exists条件),只要你where条件合适,肯定能更新到所有你需要更新的记录;
而更新所赋予BCXY_NUM字段的值则是由那个子查询语句决定的,一条记录只能有一个BCXY_NUM值,而你的子查询语句中得到的结果多于1,则代表要更新的BCXY_NUM值是有多个,那么数据库就不知道应该使用哪个值了,就发生错误了。让你在子查询中使用rownum = 1条件只是强制将子查询返回的数据限制为1个,这样每条要更新记录的BCXY_NUM值就唯一了,这样执行就能通过。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式