update cfg_custrisk r set r.needrecognise='1',r.recognisetype='1'
where exists(select 1 from ta_ack_acct t
where t.businesscode='102'
and t.transactioncfmdate>to_char((sysdate-to_number(30)),'yyyymmdd')
and r.tano = t.tano and r.taaccountid = t.taaccountid
group by t.tano, t.taaccountid
having count(1) > to_number(a3));
各位大侠们帮忙支个招!!谢了。。。
update r set r.needrecognise='1',r.recognisetype='1' from cfg_custrisk r inner join ta_ack_acct t on r.tano = t.tano and r.taaccountid = t.taaccountid where t.businesscode='102' and t.transactioncfmdate>to_char((sysdate-to_number(30)),'yyyymmdd')
这个是一段没有Group BY的脚本,可行(如果中间有小BUG可以调试下,我现在不方便),至于加上Group By后该怎么弄,我就没试过了。看是否方便用SQL环境调试下。
谢谢你的回答,你写的这种方式只是在sql server中适合,而我所使用的数据库是oracle,Oracle没有update from语法
@在他乡...:
对ORACLE不熟悉,但ORACLE比SQL SERVER更强大,不可能比SQL SERVER还弱。
ORACLE不支持UPDATE FROM,那么可能支持UPDATE TABLE1 INNER JOIN TABLE 2这样的,支持吗?或者其它类似的变通方案,肯定有,具体的就不懂了。
性能最差的是exist的使用。建议使用表连接。
该语句存在一个问题,sql中存在计算(t.transactioncfmdate>to_char((sysdate-to_number(30)),'yyyymmdd')),而且还需要转换,势必导致该字段的全表扫描。
恩,我把exist给去掉了,确实快了很多,但是还是存在体验慢的问题
@在他乡...:
可以把sql贴上来,让大家分析一下。
顺便介绍一下具体环境:如数据量、索引等,实在不行的话,把执行计划贴上来。
为了执行一个update,这么写有点绕啊。这么个SQL,Oracle在执行时,要做的事情太多了。
查找要更新的ID 写成一个视图,再用 Oracle 匿名存储过程来搞。
还有把having去掉,在操作非关系操作之前 尽量把你的结果集缩小