首页 新闻 会员 周边

如何优化该sql语句

0
悬赏园豆:10 [已解决问题] 解决于 2012-05-25 11:22

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));

 

各位大侠们帮忙支个招!!谢了。。。

在他乡...的主页 在他乡... | 初学一级 | 园豆:197
提问于:2012-05-17 16:34
< >
分享
最佳答案
1
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环境调试下。

收获园豆:10
无之无 | 大侠五级 |园豆:5095 | 2012-05-17 16:50

谢谢你的回答,你写的这种方式只是在sql server中适合,而我所使用的数据库是oracle,Oracle没有update from语法

在他乡... | 园豆:197 (初学一级) | 2012-05-18 16:38

@在他乡...: 

对ORACLE不熟悉,但ORACLE比SQL SERVER更强大,不可能比SQL SERVER还弱。

ORACLE不支持UPDATE FROM,那么可能支持UPDATE TABLE1 INNER JOIN TABLE 2这样的,支持吗?或者其它类似的变通方案,肯定有,具体的就不懂了。

无之无 | 园豆:5095 (大侠五级) | 2012-05-18 16:44
其他回答(3)
0

性能最差的是exist的使用。建议使用表连接。

该语句存在一个问题,sql中存在计算(t.transactioncfmdate>to_char((sysdate-to_number(30)),'yyyymmdd')),而且还需要转换,势必导致该字段的全表扫描。

lucika.zh | 园豆:62 (初学一级) | 2012-05-17 18:00

恩,我把exist给去掉了,确实快了很多,但是还是存在体验慢的问题

支持(0) 反对(0) 在他乡... | 园豆:197 (初学一级) | 2012-05-18 16:39

@在他乡...: 

可以把sql贴上来,让大家分析一下。

顺便介绍一下具体环境:如数据量、索引等,实在不行的话,把执行计划贴上来。

支持(0) 反对(0) lucika.zh | 园豆:62 (初学一级) | 2012-05-19 08:46
0

为了执行一个update,这么写有点绕啊。这么个SQL,Oracle在执行时,要做的事情太多了。

查找要更新的ID 写成一个视图,再用 Oracle 匿名存储过程来搞。

船长&CAP | 园豆:318 (菜鸟二级) | 2012-05-20 01:47
0

还有把having去掉,在操作非关系操作之前 尽量把你的结果集缩小

boykiller | 园豆:224 (菜鸟二级) | 2012-05-22 14:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册