TAB_A
id contact_name contact_time
1 张三 2008-11-02
1 李四 2008-12-02
2 赵五 2008-07-02
2 郑七 2008-08-02
3 周九 2008-09-02
5 王一 2008-06-02TAB_B
id contact_name contact_time
1 韩一 2007-01-02
1 苏三 2007-02-02
2 孙三 2007-11-02
4 钱二 2007-12-01TAB_C
id  contact_name
1
2
3
4
5
希望TAB_C被update成如下状况
TAB_C
id  contact_name
1 张三
2 郑七
3 周九
4 钱二
5 王一
即取A、B表对应id的最后(即contact_time最接近当前时间)一次联系人。
用UPDATE语句能实现吗?

解决方案 »

  1.   


    update TAB_C
    SET TAB_C.contact_name=(SELECT contact_name FROM ( SELECT ROW_NUMBER(PARTITION BY ID ORDER BY contact_time DESC) RN
    ,T1.* FROM ((SELECT * FROM TAB_A ) UNION ALL (SELECT * FROM TAB_B) ) T1)
    WHERE RN=1 AND T1.ID=TAB_C.ID)
     
      

  2.   

    如果TAB_A与TAB_B是两个千万行的巨表,有没有性能更好些的语句?
      

  3.   

    性能更好的语句恐怕不好写了,只能从执行策略上来想办法,比如再一个事务里更新上千万行记录,是怎么样也快不起来的。可以分批更新,来达到缩小事务的目的。
    如果你的TAB_C 中原本就有数据,到是可以考虑采用meger into的办法!楼主不妨到GOOGLE上搜搜看~
      

  4.   

    补充:使用MEGER INTO,效率的提升几乎可以用百倍计算~