【发布时间】:2012-01-14 21:38:08
【问题描述】:
我正在尝试使用 MERGE 语句合并两个表,有什么方法可以删除合并表中既没有匹配也没有更新的记录?
逻辑是: 如果匹配离开它。 如果在源删除中不匹配。 如果在目标插入中不匹配。
我知道 SQL 有源/目标匹配,oracle 有什么类似的吗?
【问题讨论】:
标签: oracle plsql merge sql-delete
我正在尝试使用 MERGE 语句合并两个表,有什么方法可以删除合并表中既没有匹配也没有更新的记录?
逻辑是: 如果匹配离开它。 如果在源删除中不匹配。 如果在目标插入中不匹配。
我知道 SQL 有源/目标匹配,oracle 有什么类似的吗?
【问题讨论】:
标签: oracle plsql merge sql-delete
据我所知,没有(一次性)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;
【讨论】:
我不太明白: 假设您有表 A 和表 B, 假设您想根据某个 ID col 将 B 合并到 A, 您是否希望 A 中与 B 具有相同 ID 的每一行都不会被更改,并且 A 中 B 中不存在的每一行(根据 ID)都将被删除,但 B 中不存在的每一行在 A 将被添加到 A ? 如果是这样,这是否意味着您要将A合并到B(但更改表A)? 为什么不将表 B 复制到另一个表 C,然后将 A 合并到 C 并将数据移回 A?
【讨论】:
假设您至少使用 Oracle 10g,MERGE 语句中有一个 DELETE WHERE 子句。
但是,就像 A.B.凯德,我不确定我是否理解您要删除的行。如果您尝试从目标表中删除源中不存在的行,使MERGE 更多的是同步而不是合并,您可以执行DELETE WHERE NOT EXISTS。但如果这是目标,我会后退一步,看看问题,因为似乎有更好的技术方法来解决您遇到的任何业务问题。如果您尝试同步两个表,您通常要么进行复制,在这种情况下,您应该使用 Oracle 的复制技术,如物化视图和 Streams,或者您不应该首先拥有两个数据副本和一个副本应该只是一个视图或引用另一个的同义词。
【讨论】: