你的目的最终是对A和B中id相同,且pay=n的记录插入要B表中
create table B2 as select id from B;
truncate table B;
insert into B(id,name,area) (select A.id,A.name,A.area from A,B2 where B2.id= A.id
and a.pay = n)

解决方案 »

  1.   

    谢谢 bluecocoqd(小骗骗)
    不过
    表A有上百万的数据每天要把符合一定条件的记录的一些字段值存入表B,
    如果每天都truncate,会不会不太好啊,有碎片多?
    还有,种种原因不需要用触发器
    能不能有其他的方法呢?
      

  2.   

    用MergeMERGE INTO table_b as B
    USING ( select * from A where A.pay = 'n' ) as Temp
    ON ( B.ID = Temp.ID )WHEN MATCHED THEN
      UPDATE B SET
          B.name = Temp.name,
          B.area = Temp.areaWHEN NOT MATCHED THEN
      INSERT INTO B ( id, name, area )
        VALUES ( Temp.id, Temp.name, Temp.area );
      

  3.   

    truncate B会带来问题的,因为B当中可能有与A中根本不匹配的ID存在,truncate之后会造成数据丢失
    而且,无法rollback
      

  4.   

    谢谢:kulama2004(kulama)
    “truncate B会带来问题的,因为B当中可能有与A中根本不匹配的ID存在,truncate之后会造成数据丢失
    而且,无法rollback”
    可能我没表述清楚
    B中如果有与A中不匹配的ID存在,则应该在B中删除此ID。
    truncate无法rollback
    不过如果用delete 是不是太慢了呢? 
      

  5.   

    问题是。。你truncate之后,B就变成空表了
    一条记录都没有,还怎么知道--“如果B中有记录的id和要插入的数据id相同,则判断name、area是否一致”你应该先把不同的纪录都删了,然后update所有id相同的纪录,使name、area一致1.delete from B where B.id not in (select A.id from A where A.pay = n)2.insert into B(id,name,area) (select A.id,A.name,A.area from A where A.id in ( select B2.id from B B2 ) and A.pay = n)
      

  6.   

    不好意思2写错2.update B set 
        B.name = (select A.name from A where A.id = B.id and A.pay = n),
        B.area = (select A.area from A where A.id = B.id and A.pay = n)
      

  7.   

    还有一点你必须要保证id 在A表中是unique key或者primary key
      

  8.   

    delete update insert 不提交的话回使用临时区域.上百万条数据可能会让你做不成.
      

  9.   

    建议考虑一下ROWID然后做个存储过程.
      

  10.   

    truncate表不会产生碎片,delete才会产生!
    truncate 表B
    insert into 表B
    select distinct id,name,area from 表A
    where pay=n我想你要实现的就是上面的操作吧!