1

我有一个表 ( tblA) 和一个查询 ( queryB)。的输出queryB与 的架构匹配tblA。我想更新tblA,使其内容等于queryB

一个明显的解决方案可能是:

TRUNCATE TABLE tblA

INSERT INTO tblA
(queryB)

但是,我想尽量减少我所做的删除和插入的次数。

将有三种情况,其结果来自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);

编辑:
如果将创建小型临时表(将包含 < 10% 的表 tblA 行),则可以计算一次 queryB。
假设 queryB.col1 永远不会为空

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 回答