我有两个列数相同的表: - 表A和表B. 每天我都会将表B中的数据插入到表A中。现在插入查询正在运行
insert into table_a (select * from table_b);
但是通过这个插入先前插入的相同数据也会被插入。我只想要那些新的或从旧数据中更改的行。怎么办呢?
答案 0 :(得分:2)
您可以使用minus
:
insert into table_a
select *
from table_b
minus
select *
from table_a;
这假定通过"重复"你的意思是所有的列都是重复的。
答案 1 :(得分:0)
如果您有时间戳字段,则可以使用它将记录限制为最后一次复制后创建的记录。
另一种选择是,假设您有一个主键(我的示例中为id
列),您可以使用它来了解是否已经复制了一条记录,您可以创建一个表c
(与a
和b
)具有相同的结构并执行以下操作:
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)