我需要创建一个程序包,以将大量数据从数据库表迁移到另一个数据库表中。源表将在大约4,5天内连续获取新数据,因此我将一次又一次运行我的包。
我需要将所有数据从该表迁移到另一个表,但是我不想迁移那些已经迁移的数据。为此,我需要使用哪种转换或需要编写什么SQL命令?
通常的方法是在源表上放置“审核”时间戳,并仅迁移在上一次迁移之后更新或插入的记录。
例如:
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选择源。*在(src.id = tgt.id)上加入tgt,其中(src.column1 <> tgt.column1或src.column2 <> tgt.column2 ............ )
请注意,这些方法中的任何一种都不涉及源代码中的删除。如果要使表同步,则唯一的方法是(源-目标)获取插入/更新更改,并(目标-源)获取已删除的行并在目标中执行相同操作。
2.插入并忽略主要约束错误:
如果源中的数据可以更改,并且您希望将更新传播到目标,则这将带来严重的问题。您还将每次都查询整个源。通常,最好将合并/更新与已过滤的源数据一起使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句