如何更新/插入表而不创建新表(临时或其他)

时间:2012-05-08 17:51:15

标签: oracle upsert

背景:我的团队有一个更新聚合表的etl作业。每行包含特定日期的数据,但此行可以并且将在行日期之后更新(这意味着任何行都可以包含来自多个作业的数据)。这个ETL工作在上周错过了一天的一些数据,现在我需要回填它。

问题:我有丢失的数据,我计划做的是将数据转储到临时表中,然后将其与agg表合并。这样我可以处理ETL作业是否已包含该行的数据(更新)或是否需要添加新行(插入),但我没有足够的权限来创建临时表,而且我'我不想让DBA参与进来。

问题:我是否可以在不创建临时表的情况下执行插入/更新行为(顺便说一下,这是Oracle SQL)。

编辑:数据来自tsv文件。

1 个答案:

答案 0 :(得分:2)

为什么要避免涉及DBA? DBA应该完全了解数据库中发生的事情,因为它们最终负责其中的数据状况。所以你不应该和他们一起玩偷偷摸摸的突击队。

由于您有一个缺少数据的文件,将其呈现给数据库的最简单方法是使用an external table。这需要创建表,也可能是目录对象。您需要DBA帮助完成此任务。

避免创建数据库对象的唯一方法是将TSV文件转换为一系列DML语句。支持正则表达式和/或记录宏的IDE将在这里证明是无价的。我喜欢TextPad;其他编辑可用。

在Oracle中执行upserts的DML语句是the MERGE statement。你需要注意的一件事是新生。您丢失的数据来自上周。如果存在一行,则可能已在中间期间添加或修改 。您必须编写MERGE语句,以便它不会使用旧的东西覆盖更新的数据。希望您的表具有有用的元数据列,例如DATE_CREATED和LAST_UPDATED。