SQL比较弱,请教大家一个问题
现在有临时表PRE_TAIL_FORM_TMP和普通表PRE_TAIL_FORM,表结构一致,
PRE_TAIL_FORM中存储着全部的业务数据,PRE_TAIL_FORM_TMP存放着该次业务处理的数据,
现需求如下,如果PRE_TAIL_FORM_TMP中的BILL_NO在PRE_TAIL_FORM存在,则更新PRE_TAIL_FORM的数据,
如果不存在则新增数据至PRE_TAIL_FORM。请问下怎么写SQL比较好。

解决方案 »

  1.   

    1,使用存储过程,写逻辑,两条sql
    2,搜索 oracle MERGE,一条sql参考SQL> MERGE INTO products p
        2 USING newproducts np
        3 ON (p.product_id = np.product_id)
        4 WHEN MATCHED THEN
        5 UPDATE
        6 SET p.product_name = np.product_name,
        7 p.category = np.category
        8 WHERE p.category = 'DVD'
        9 WHEN NOT MATCHED THEN
        10 INSERT
        11 VALUES (np.product_id, np.product_name, np.category)
        12 WHERE np.category != 'BOOKS'
        SQL> /
      

  2.   

    最好分两步,先查询,再做更新或插入,如果用的是oracle,建议用更新时用rowid,这样速度比较快
      

  3.   


    谢谢关注,考虑到PRE_TAIL_FORM表中的数据比较多,大概有每天都有10万条,有什么其它的方案吗,oracle MERGE我还是第一次知道,去学习一下,多谢。
      

  4.   


    是Oracle,具体的我再看下,我的想法是一步搞定。
      

  5.   

    用MERGE是比较好的做法。
    每天10万条,那你这个PRE_TAIL_FORM总容量怕是够呛。不过如果你都是根据主键匹配来更新的话,性能倒也不会太差。关键是PRE_TAIL_FORM_TMP每次要处理的数据行数有多少。
      

  6.   


    临时表一次差不多6000条,PRE_TAIL_FORM做了按天分区,我刚才试了下MERGE的做法,
    满足我的需求了,谢谢。
      

  7.   


    就是前面几位大拿说的方法,给你个帖子你去看下吧
    http://www.cnblogs.com/highriver/archive/2011/08/02/2125043.html好了,结贴了,多谢帮忙。