oracle - 如何在不创建新表(临时表或其他表)的情况下更新/插入表

标签 oracle upsert

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

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

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

编辑:数据来自 tsv 文件。

最佳答案

为什么要避免让 DBA 参与进来? DBA 应该充分了解数据库中发生的情况,因为他们最终对数据库中数据的状况负责。所以你不应该和他们玩偷偷摸摸的突击队。

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

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

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

关于oracle - 如何在不创建新表(临时表或其他表)的情况下更新/插入表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10503798/

相关文章:

database - 无法在 SysAux 中恢复损坏的 Oracle 数据文件 block

sql-server - 检查记录是否存在,如果是,则“更新”,如果不是,则“插入”

SQLite - UPSERT *不是* INSERT 或 REPLACE

database - 具有插入或更新机制的Spring批处理自定义itemWriter

sql - 如何从表中删除日期早于 2006 年的数据

sql - ORA-00907: 缺少右括号 SQL Developer

sql - 当列在 Postgres 中可以为空时处理索引冲突

postgresql - Postgres 9.5+ : UPSERT to return the count of updated and inserted rows

sql - 使用从同一表计算的值更新表的最佳方法

java - Liquibase,在Oracle中创建外键,前提条件