如何检查数据库中是否已存在一组行并跳过迁移?

问题描述 投票:1回答:2

我需要创建一个包来将大量数据从数据库表迁移到不同的数据库表。源表将持续在4,5天内获得新数据,因此我将一次又一次地运行我的包。

我需要将此表中的所有数据迁移到另一个表,但我不想迁移已迁移的那些数据。我需要使用什么样的转换或者我需要编写哪些SQL命令才能执行此操作?

sql ssis
2个回答
0
投票

通常的方法是在源表上设置“audit”时间戳,并仅迁移在上次迁移后更新或插入的记录。

例如:

Table Sales

sale_id
sale_date
sale_amount
...............
dw_create_date 
dw_update_date

你的源提取可能是......

select sales.sale_id,
       sales.sale_date,
....
from   sales
where dw_updated_date > {last_migration_date}

last_migration_date通常从配置文件或表中读取。

其他方法

您可以使用其他一些方法,但随着数据大小的增加,所有这些方法都会出现更大的性能问题。

1)执行(目标 - 源)数据,以获取源中已更改的行。

select *
from source
minus
select * from target

您可以使用源和目标之间的连接执行相同的操作。

select source。* from src left join tgt on(src.id = tgt.id)where(src.column1 <> tgt.column1或src.column2 <> tgt.column2 ............ )

请注意,这些方法中的任何一种都不会处理源中的删除。如果您希望表同步,那么唯一的方法是执行(source-target)获取插入/更新更改和(target-source)获取已删除的行并在目标中执行相同操作。

2.插入并忽略主要约束错误:

如果数据可以在源中更改并且您希望更新传播到目标,则会出现严重问题。您每次都要查询整个源代码。通常,最好使用Merge / Upsert和过滤后的源数据。


0
投票

我会假设两个表都有一些唯一的标识符,不是吗?

表A具有:1 2 3 4

您正在将其移至表B,但同时保留表A中的数据,是吗?

所以你已经完成了一次工作。现在表B有:1 2 3 4

表A得到更新。它现在有:1 2 3 4 5 6 7

你再次运行你的工作,但你只想发送超过5,6,7。

SELECT *
FROM TableA
LEFT OUTER JOIN TableB ON TableA.ID = TableB.ID
WHERE TableB.ID = NULL.

如果你有一些样本数据,它会有所帮助。这会给你一个好主意吗?

见加入:http://i.stack.imgur.com/1UKp7.png

© www.soinside.com 2019 - 2024. All rights reserved.