在Oracle SQL中将新的/更改从一个表插入另一个表

时间:2014-07-19 17:30:36

标签: sql oracle

我有两个列数相同的表: - 表A和表B. 每天我都会将表B中的数据插入到表A中。现在插入查询正在运行

insert into table_a (select * from table_b);

但是通过这个插入先前插入的相同数据也会被插入。我只想要那些新的或从旧数据中更改的行。怎么办呢?

4 个答案:

答案 0 :(得分:2)

您可以使用minus

insert into table_a
    select *
    from table_b
    minus
    select *
    from table_a;

这假定通过"重复"你的意思是所有的列都是重复的。

答案 1 :(得分:0)

如果您有时间戳字段,则可以使用它将记录限制为最后一次复制后创建的记录。

另一种选择是,假设您有一个主键(我的示例中为id列),您可以使用它来了解是否已经复制了一条记录,您可以创建一个表c(与ab)具有相同的结构并执行以下操作:

insert into table c 
  select a.* from table a
  left join table b on (a.id=b.id)
  where b.id is null;

insert into table b select * from table c;

truncate table c;

您需要调整此查询才能使用实际的主键。

希望这有帮助!

答案 2 :(得分:0)

如果表具有主键或唯一键,则可以在反连接中利用它:

insert into table_a
select *
from table_b b
where not exists (
  select null
  from table_a a
  where
    a.pk_field_1 = b.pk_field_1 and
    a.pk_field_2 = b.pk_field_2
)

答案 3 :(得分:0)

你没说出你的钥匙是什么。假设您有一个密钥ID,那么您只需要表A中尚未包含的ID。您也可以使用Merge-Statement:

MERGE INTO A USING B ON (A.ID = B.ID)
WHEN NOT MATCHED THEN INSERT (... columns of A) VALUES (... columns of B)