2011-12-07 18 views
1

MERGEステートメントを使用して2つのテーブルをマージしようとしていますが、マージされたテーブル内の一致しないか更新されていないレコードを削除する方法はありますか?PLSQLマージの削除

論理は と一致するとそのままにします。ソース削除で一致しない場合は ターゲットインサートで一致しない場合。

私はSQLにソース/ターゲットマッチングがあることを知っています。オラクルには何か類似していますか?

答えて

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; 
+0

こんにちは、このロジックの周りにソリューションを構築しました。ありがとうございます。私の説明に従わなかった他の人には申し訳ありませんが、あなたの意見をどうもありがとう。 :) – Magezy

0

私は本当に理解していない: は、テーブルAとテーブルB、 を考えてみましょうあなたは、Bと同じIDを持つAのすべての行が変更されず、Bの中に存在しないAのすべての行が必要であることを望みますか? IDによると)削除されますが、Aに存在しないBのすべての行がAに追加されますか? もしそうなら、あなたはAをBにマージしたいのですが(テーブルAを変更する)という意味ではありませんか? テーブルBを別のテーブルにコピーしてCをマージし、データをAに戻すのはなぜですか?

+0

彼はBをAにマージしようと思っています - 彼はAとBと同じ行を持つように変更したいと思っています。 –

0

少なくともOracle 10gを使用していると仮定すると、MERGE文にはDELETE WHERE句があります。

しかし、A.B. Cade、私はあなたが削除しようとしている行を理解しているのか分かりません。ソースに存在しない行を宛先表から削除しようとしているときに、をマージより多くの同期化を行う場合は、DELETE WHERE NOT EXISTSを実行できます。しかし、それが目標であれば、私は一歩前進して問題を見ていきます。なぜなら、どんなビジネス問題であれ、より良い技術的アプローチがあるように思われるからです。 2つの表を同期しようとしている場合は、一般的にはレプリケーションを実行しています。その場合は、マテリアライズド・ビューやStreamsなどのOracleのレプリケーション・テクノロジを使用する必要があります。コピーは、他のものを参照するビューまたは同義語でなければなりません。

関連する問題