我正在使用 SSIS 包将数据从 SQL Server 复制到 Oracle,并且希望通过增量更新来提高复制性能。
我的想法是:
- 追加表的新记录。(先删除再追加)
- 删除“已删除”记录
代码:
drop table A1
drop table A2
--Old Table
create Table A1(id int,
a1 int, a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int)
--New Table
create Table A2(id int,
a1 int, a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int)
insert into A1 (id, a1, a2, a3, a4, a5, a6, a7, a8)
values (1,1,2,3,4,5,6,7,8), (2,2,2,5,4,2,6,2,8), (3,3,2,5,4,5,4,3,8),
(4,3,1,3,4,5,7,3,8)
insert into A2 (id, a1, a2, a3, a4, a5, a6, a7, a8)
values (1,2,2,3,4,5,6,7,8), (2,2,2,5,4,2,6,2,8), (3,3,2,5,4,5,4,3,8)
--1) Changed values
select * from a2
except
select * from a1;
--2) "Deleted" Values. If I Have primary key in A1,A2 the result is simply get by query
select a1.*
from A1
left join A2 on a2.id = a1.id
where a2.id is null
但在我的实际情况下,我的表上没有主键。如何在不通过主键连接的情况下通过另一种方式实现 2 点?
查询结果:
id a1 a2 a3 a4 a5 a6 a7 a8
1 2 2 3 4 5 6 7 8
id a1 a2 a3 a4 a5 a6 a7 a8
4 3 1 3 4 5 7 3 8
最佳答案
通过使用MERGE您可以在单个操作中执行 INSERT、UPDATE 和 DELETE 语句,它非常适合增量加载。
示例代码:
MERGE A2 AS target
USING (SELECT * FROM A1) AS source
ON (target.Id = source.Id AND target.a1 = Source.a1...) -- More join condition
WHEN MATCHED THEN
UPDATE SET a2 = source.a2, a3 = source.a3 ------ more columns
WHEN NOT MATCHED THEN
INSERT (Id, A1, a1, a2....)
VALUES (source.Id, source.a1, source.a2.....)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
END;
MERGE 语句还提供了捕获插入、删除和更新记录的灵活性(以防万一,您需要它们来记录目的),但我不推荐它们,除非您确实需要该信息。
在上面的查询中,您可以保留要比较的列
ON (target.Id = source.Id AND target.a1 = Source.a1...) -- More join
在SSIS
您可以使用 LOOKUP 转换来查找匹配和不匹配的记录,然后插入或删除记录。 无论如何,如果您在将源表与目标表进行比较时考虑所有列,那么更新将毫无意义。
关于sql - 表的增量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33094129/