sql - 表的增量更新

标签 sql sql-server t-sql integration etl

我正在使用 SSIS 包将数据从 SQL Server 复制到 Oracle,并且希望通过增量更新来提高复制性能。

我的想法是:

  1. 追加表的新记录。(先删除再追加)
  2. 删除“已删除”记录

代码:

 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/

相关文章:

sql - Perl、DBI 和 SQL : Why NOT does not work in some SQL queries?

mysql - 在涉及第二个表中的重复项时有一个左连接 - MYSQL

sql - 返回字段编号最高的行的单个查询

sql-server - 获取日期减去 1 天,但恰好是凌晨 4 点

sql - 在 SQL Server 查询结果中显示小计

sql - 选择最小行

sql - 多次加入表

c# - 'Microsoft.ACE.OLEDB.14.0' 提供者未在本地机器上注册

.net - 如果我从未在另一个事务中读取 volatile 数据,那么 SqlTransaction 中的 IsolationLevel 有什么用?

mysql - mssql 到 mysql 转换工具