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

时间:2014-12-23 19:04:41

标签: sql ssis

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

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

2 个答案:

答案 0 :(得分:0)

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

表A有: 1 2 3 4

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

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

表A更新。它现在有: 1 2 3 4 五 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

答案 1 :(得分:0)

通常的做法是通过"审核"源表上的时间戳,仅迁移上次迁移后更新或插入的记录。

例如:

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

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

选择来源。* 来自src left join tgt on(src.id = tgt.id) where(src.column1<> tgt.column1或        src.column2<> tgt.column2       ............       )

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

<强> 2。插入并忽略主要约束错误:

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