1

テーブル ( tblA) とクエリ ( queryB) があります。の出力はqueryBのスキーマと一致しますtblAtblA内容が等しくなるように更新したいqueryB

これに対する明らかな解決策は次のとおりです。

TRUNCATE TABLE tblA

INSERT INTO tblA
(queryB)

ただし、削除と挿入の回数を最小限に抑えたいと考えています。

からの結果には 3 つのケースがありますqueryB

  • ではqueryBなくtblA: 挿入
  • queryB、でtblA: 何もしない
  • ではtblAなくqueryB: 削除

これまでのところ、MS SQL の MERGE サポートが[NOT] PRESENT IN TARGET/SOURCEこれに最適であることがわかりましたが、Oracle に相当するものは見つかりませんでした。

これを達成するエレガントな方法はありますか?

4

1 に答える 1

1
delete from tblA where
  (col1, col2, ...) not in (queryB);

insert into tblA 
  (queryB) minus (select * from tblA);

編集:
小さな一時テーブルが作成される場合は、queryBを1回計算できます(テーブルtblAの行の10%未満が含まれます)。
queryB.col1がnullになることはないと想定されています

create table diff as
   select 
      ta.rowid ta_rid, 
      tb.*
   from tblA ta 
      full join (queryB) tb 
         on ta.col1 = tb.col1 
         and ta.col2 = tb.col2 
         and ta.col3 = tb.col3 
   where 
      ta.rowid is null or tb.col1 is null; 

delete from tblA ta 
  where ta.rowid in (select d.ta_rid from diff d where d.ta_rid is not null);
insert into tblA ta 
  select d.col1, d.col2, d.col3 from diff d where d.ta_rid is null;      
于 2013-03-12T11:11:03.467 に答える