13

Oracleマージを使用して挿入および削除するが更新しない方法はありますか?

別のテーブルの 1 つの行に関連する一連の値を表すテーブルがあります。値をすべて削除して新しいセットを追加し直すか、一部を選択的に削除して他の値を追加することで、値のセットを変更できますが、可能であれば単一のステートメントにすることに興味があります。

これは、更新を使用した実際の例です。これを機能させるには、条件dummyにない列を更新できるように追加する必要がありました。onダミー列を更新せずに削除と挿入のみを行う方法はありますか?

実際に更新されていなくても、on条件の列がリストにない場合があります。update set

create table every_value ( the_value varchar2(32) );
create table paired_value ( the_id number, a_value varchar2(32) , dummy number default 0 );
-- the_id is a foreign_key to a row in another table

insert into every_value ( the_value ) values ( 'aaa' );
insert into every_value ( the_value ) values ( 'abc' );
insert into every_value ( the_value ) values ( 'ace' );
insert into every_value ( the_value ) values ( 'adg' );
insert into every_value ( the_value ) values ( 'aei' );
insert into every_value ( the_value ) values ( 'afk' );

-- pair ace and afk with id 3
merge into paired_value p using every_value e
on ( p.the_id = 3 and p.a_value = e.the_value )
when matched then update set dummy=dummy+1
delete where a_value not in ('ace','afk')
when not matched then insert (the_id,a_value)
values (3,e.the_value)
where e.the_value in ('ace','afk');

-- pair ace and aei with id 3
-- should remove afk, add aei, do nothing with ace
merge into paired_value p using every_value e
on ( p.the_id = 3 and p.a_value = e.the_value )
when matched then update set dummy = dummy+1
delete where a_value not in ('ace','aei')
when not matched then insert (the_id,a_value)
values (3,e.the_value)
where e.the_value in ('ace','aei');

-- pair aaa and adg with id 4
merge into paired_value p using every_value e
on ( p.the_id = 4 and p.a_value = e.the_value )
when matched then update set dummy = dummy+1
delete where a_value not in ('aaa','adg')
when not matched then insert (the_id,a_value)
values (4,e.the_value)
where e.the_value in ('aaa','adg');

select * from paired_value;

私は oracle 10g でこれを試しました。このsqlfiddleで oracle 11g を試しました。

4

2 に答える 2

19

いいえ、merge コマンドで更新されていない行は削除できません。
ドキュメントは次のとおりです。http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm

DELETE where_clause を指定して、表の移入または更新中に表のデータをクリーンアップします。この句の影響を受ける行は、マージ操作によって更新される宛先テーブル内の行だけです。DELETE WHERE 条件は、UPDATE SET ... WHERE 条件によって評価された元の値ではなく、更新された値を評価します。宛先テーブルの行が DELETE 条件を満たしているが、ON 句で定義された結合に含まれていない場合、その行は削除されません。行を削除するたびに、ターゲット表で定義されたすべての削除トリガーがアクティブ化されます。

つまり、行を更新する必要があります。ただし、すべての行を更新する必要はありません。UPDATE の後は、DELETE の後に使用しているのと同じ WHERE 句を使用します。

when matched then update set dummy=dummy
    where a_value not in ('ace','afk')
delete 
    where a_value not in ('ace','afk')
于 2013-07-17T20:57:44.893 に答える
1

列をそれ自体に設定できることがわかりました:

MERGE ...
WHEN MATCHED THEN 
   UPDATE SET a_value = a_value WHERE a_value not in ('ace','afk')
   DELETE WHERE a_value not in ('ace','afk')

これにより、ダミー列が不要になります。

于 2014-02-20T23:46:44.750 に答える