WHEN MATCHED THEN
    UPDATE
    SET p.product = b.product when not ~~~~~
insert
(******)values(*****)
原本是没问题,但数据量大了后,我想看哪条纪录在该执行中被修改或添加了就没办法了,于是加了个字段,做了些改动:
WHEN MATCHED THEN
    UPDATE
    SET p.product = b.product ,
        p.uptime = sysdatewhen not ~~~~~
insert
(****** uptime)values(***** sysdate)这样改了以后就报错了
unable to get a stable set of rows in the source tables求解

解决方案 »

  1.   

    语句贴一下,不该有问题的.
    SQL> select * from t_merge_a;
     
             ID NAME       CREATEDATE
    ----------- ---------- -----------
              1 test       2010-9-27 
     
    SQL> select * from t_merge_b;
     
             ID NAME
    ----------- ----------
              1 test
              2 just
     
    SQL> select id,name,to_char(createdate,'yyyy-mm-dd hh24:mi:ss') from t_merge_a;
     
             ID NAME       TO_CHAR(CREATEDATE,
    ----------- ---------- ------------------------------
              2 just       2010-09-27 14:18:19
              1 test       2010-09-27 14:18:19
     
    SQL> 
      

  2.   


    SQL> select * from t_merge_a;
     
             ID NAME       CREATEDATE
    ----------- ---------- -----------
              1 test       2010-9-27 
     
    SQL> select * from t_merge_b;
     
             ID NAME
    ----------- ----------
              1 test
              2 just
     
    SQL> 
    SQL> merge into t_merge_a a
      2  using t_merge_b b
      3  on (a.id=b.id and a.name=b.name)
      4  when matched then update set a.createdate=sysdate
      5  when not matched then insert(a.id,a.name,a.createdate)
      6                         values(b.id,b.name,sysdate);
     
    Done
     
    SQL> select id,name,to_char(createdate,'yyyy-mm-dd hh24:mi:ss') from t_merge_a;
     
             ID NAME       TO_CHAR(CREATEDATE,
    ----------- ---------- ------------------------------
              2 just       2010-09-27 14:18:19
              1 test       2010-09-27 14:18:19
     
    SQL> 
      

  3.   

    你的set 只对一个字段做了操作,我的情况是2个
      

  4.   

    update set a.name = b.vname,a.createdate=sysdate
      

  5.   

    SQL> merge into t_merge_a a
      2  using t_merge_b b
      3  on (a.id=b.id )
      4  when matched then update set a.createdate=sysdate,a.name=b.name
      5  when not matched then insert(a.id,a.name,a.createdate)
      6                         values(b.id,b.name,sysdate);
     
    Done
     
    SQL> select id,name,to_char(createdate,'yyyy-mm-dd hh24:mi:ss') from t_merge_a;
     
             ID NAME       TO_CHAR(CREATEDATE,'YYYY-MM-DD
    ----------- ---------- ------------------------------
              2 just       2010-09-27 14:34:19
              1 test       2010-09-27 14:34:19
     
    SQL> 
      

  6.   

    SQL 我是真想贴.........但电脑之间有限制
      

  7.   

    知道了..
    因为你匹配的时候数据不是一一对应.看下面的数据,t_merge_b里id=2的数据有两条时也会报你说的错误.
    SQL> merge into t_merge_a a
      2  using t_merge_b b
      3  on (a.id=b.id )
      4  when matched then update set a.createdate=sysdate,a.name=b.name
      5  when not matched then insert(a.id,a.name,a.createdate)
      6                         values(b.id,b.name,sysdate);
     
    Done
     
    SQL> select id,name,to_char(createdate,'yyyy-mm-dd hh24:mi:ss') from t_merge_a;
     
             ID NAME       TO_CHAR(CREATEDATE,'YYYY-MM-DD
    ----------- ---------- ------------------------------
              2 just       2010-09-27 14:34:19
              1 test       2010-09-27 14:34:19
     
    SQL> select id,name from t_merge_b;
     
             ID NAME
    ----------- ----------
              2 just
              1 test
              2 just
     
    SQL> 
    SQL> merge into t_merge_a a
      2  using t_merge_b b
      3  on (a.id=b.id )
      4  when matched then update set a.createdate=sysdate,a.name=b.name
      5  when not matched then insert(a.id,a.name,a.createdate)
      6                         values(b.id,b.name,sysdate);
     
    merge into t_merge_a a
    using t_merge_b b
    on (a.id=b.id )
    when matched then update set a.createdate=sysdate,a.name=b.name
    when not matched then insert(a.id,a.name,a.createdate)
                           values(b.id,b.name,sysdate)
     
    ORA-30926: unable to get a stable set of rows in the source tables
     
    SQL>