A表中有账号(ac_id) 和 积分(points)两个字段
B表中有账号(ac_id) 和 交易金额(tx_amt) 交易日期(tx_date)三个字段
其中积分是每交易一元钱积一分,A表中记录着每一个账号所有的积分,现在我想从A表中去掉昨天每个账号所积的分,问大家这个SQL语句怎么写啊,谢谢大家了

解决方案 »

  1.   

    update A set A.points=a.points - nvl((select sum(b.tx_amt)  from B where a.ac_id=b.ac_id and B.tx_date=:1),0)
    where exists(select 1 from B where a.ac_id=b.ac_id) using to_date(日期,'YYYY-MM-DD')
      

  2.   

    楼上的 zhangwonderful大哥,解释一下您的代码号码,我是小菜菜,不懂得为什么要这么些,谢谢您了
      

  3.   

    UPDATE a
    SET a.points = a.points - (SELECT SUM(nvl(tx_amt, 0))
                               FROM b
                               WHERE b.ac_id = a.ac_id
                               AND trunc(tx_date ,'dd')=trunc((SYSDATE - 1),'dd');
      

  4.   

    update tb1 set points = points - (select sum(tx_amt) from tb2 where tb1.ac_id = tb2.ac_id and trunc(tx_date) = trunc(sysdate-1) group by ac_id)
    where exists (select 1 from tb2 where tb1.ac_id = tb2.ac_id and trunc(tx_date) = trunc(sysdate-1));
      

  5.   

    huangyunzeng2008大哥,您的这个语句和 zhangwonderful大哥的语句,关键的区别就在于没有
    where   exists(select   1   from   B   where   a.ac_id=b.ac_id)   using   to_date(日期, 'YYYY-MM-DD ')这一句,但是A表的数据量特别大,而B的数据量相对要小一些,我不知道,您的这条语句会不会逐条的去对比A表中的数据,那样的话,效率就会低很多,我不知道该怎么写效率会高一些
      

  6.   

    大家帮我解释一些
    update A set …… where exists (……)
    这个语句的作用好吗?
      

  7.   


    只更新A表中满足exists条件中的记录,这样效率高些。
      

  8.   


    用nvl函数处理一下是可以的;
    如果没用nvl函数处理,就会将A表中不满足exists条件的记录置为null了。
      

  9.   

    确实是为了提高效率,不加exists也是正确的
      

  10.   

    如果把您的语句
    update tb1 set points = points - (select sum(tx_amt) from tb2 where tb1.ac_id = tb2.ac_id and trunc(tx_date) = trunc(sysdate-1) group by ac_id)
    where exists (select 1 from tb2 where tb1.ac_id = tb2.ac_id and trunc(tx_date) = trunc(sysdate-1));改成
    update tb1 set points = points - (select sum(tx_amt) from tb2 where tb1.ac_id = tb2.ac_id and trunc(tx_date) = trunc(sysdate-1) group by ac_id)
    where tb1.ac_id in (select tb.ac_id from tb2 where trunc(tx_date) = trunc(sysdate-1));哪个效率高啊?