MERGEステートメントを使用して2つのテーブルをマージしようとしていますが、マージされたテーブル内の一致しないか更新されていないレコードを削除する方法はありますか?PLSQLマージの削除
論理は と一致するとそのままにします。ソース削除で一致しない場合は ターゲットインサートで一致しない場合。
私はSQLにソース/ターゲットマッチングがあることを知っています。オラクルには何か類似していますか?
MERGEステートメントを使用して2つのテーブルをマージしようとしていますが、マージされたテーブル内の一致しないか更新されていないレコードを削除する方法はありますか?PLSQLマージの削除
論理は と一致するとそのままにします。ソース削除で一致しない場合は ターゲットインサートで一致しない場合。
私はSQLにソース/ターゲットマッチングがあることを知っています。オラクルには何か類似していますか?
私が知る限り、これのための(ワンショット)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、 を考えてみましょうあなたは、Bと同じIDを持つAのすべての行が変更されず、Bの中に存在しないAのすべての行が必要であることを望みますか? IDによると)削除されますが、Aに存在しないBのすべての行がAに追加されますか? もしそうなら、あなたはAをBにマージしたいのですが(テーブルAを変更する)という意味ではありませんか? テーブルBを別のテーブルにコピーしてCをマージし、データをAに戻すのはなぜですか?
彼はBをAにマージしようと思っています - 彼はAとBと同じ行を持つように変更したいと思っています。 –
少なくともOracle 10gを使用していると仮定すると、MERGE
文にはDELETE WHERE
句があります。
しかし、A.B. Cade、私はあなたが削除しようとしている行を理解しているのか分かりません。ソースに存在しない行を宛先表から削除しようとしているときに、をマージより多くの同期化を行う場合は、DELETE WHERE NOT EXISTS
を実行できます。しかし、それが目標であれば、私は一歩前進して問題を見ていきます。なぜなら、どんなビジネス問題であれ、より良い技術的アプローチがあるように思われるからです。 2つの表を同期しようとしている場合は、一般的にはレプリケーションを実行しています。その場合は、マテリアライズド・ビューやStreamsなどのOracleのレプリケーション・テクノロジを使用する必要があります。コピーは、他のものを参照するビューまたは同義語でなければなりません。
こんにちは、このロジックの周りにソリューションを構築しました。ありがとうございます。私の説明に従わなかった他の人には申し訳ありませんが、あなたの意見をどうもありがとう。 :) – Magezy