PLSQL Merge删除

时间:2011-12-07 11:01:36

标签: oracle plsql merge sql-delete

我正在尝试使用MERGE语句合并两个表,是否有任何方法可以删除合并表中尚未匹配或更新的任何记录?

逻辑是: 如果匹配则离开它。 如果在源删除中不匹配。 如果目标插入不匹配。

我知道SQL有源/目标匹配,有什么类似的oracle吗?

3 个答案:

答案 0 :(得分:2)

据我所知,没有(一次性)SQL。

在PL / SQL中,您可以这样做(例如,以某种方式丑陋):

BEGIN

FOR r in (select a1,a2,b1,b2,b.rowid from a full outer join b on a.a1=b.b1)
loop

  if r.a1 is null 
  then 
     delete from b where rowid=r.rowid;
  end if;

  if r.b1 is null
  then 
     insert into b values (r.a1, r.a2);
  end if;

end loop;
END;

答案 1 :(得分:0)

我真的不明白: 假设你有表A和表B, 并且假设你想根据一些ID col将B合并到A, 你是否希望A中与B具有相同ID的每一行都不会被改变,并且A中不存在于B中的每一行(根据ID)将被删除但B中的每一行都不存在在A中会加入A? 如果是这样,是不是意味着要将A合并到B(但更改表A)? 为什么不将表B复制到另一个表C然后将A合并到C并将数据移回A?

答案 2 :(得分:0)

假设您至少使用Oracle 10g,MERGE语句中有一个DELETE WHERE子句。

但是,和A.B.一样。凯德,我不确定我理解你要删除哪些行。如果您尝试从目标表中删除源中不存在的行,使MERGE更多的同步而不是合并,则可以执行DELETE WHERE NOT EXISTS。但如果这是目标,我会退后一步看看问题,因为对于你遇到的任何业务问题,似乎有更好的技术方法。如果你正在尝试同步两个表,那么你通常要么进行复制,在这种情况下你应该使用Oracle的复制技术,比如物化视图和Streams,或者你不应该首先拥有两个数据副本,一个copy应该只是一个引用另一个的视图或同义词。