如何在没有 MERGE 语句的情况下执行 Update else Insert 操作 win INFORMIX

Posted

技术标签:

【中文标题】如何在没有 MERGE 语句的情况下执行 Update else Insert 操作 win INFORMIX【英文标题】:How to perform Update else Insert Operation win INFORMIX without MERGE Statement 【发布时间】:2020-11-01 15:00:12 【问题描述】:

假设我有两个表 - 源和目标。我正在尝试从源加载目标表,并且仅当目标表中不存在该记录时才应插入该记录,否则应对其进行更新。应考虑所有列进行比较。除了 Merge 语句之外,Informix 中是否还有其他可用选项。

【问题讨论】:

【参考方案1】:

正如您现在的know,在 Informix 10.00(或 11.50.xC6 之前的任何版本)中不存在 MERGE 语句。

没有简单的方法。

概括地说,最接近的近似值是:

    确定源表和目标表中的主键列——我假设它们是名称为src_primary_keytgt_primary_key 的单列键。如果它们是多列键,则生活会更加复杂,但并非无法克服。

    通常,您可以使用以下方法插入缺失的记录:

     INSERT INTO Target
         SELECT *
           FROM Source
          WHERE src_primary_key NOT IN (SELECT tgt_primary_key FROM Target)
    

    但是,您可能违反了从要插入的表中进行选择的限制,因此您最终会这样做:

     SELECT src_primary_key
       FROM Source
      WHERE src_primary_key NOT IN (SELECT tgt_primary_key FROM Target)
       INTO TEMP Missing_Keys
    
     INSERT INTO Target
         SELECT *
           FROM Source
          WHERE src_primary_key IN (SELECT src_primary_key FROM Missing_Keys)
    

    由于您希望更新替换现有数据,因此您可以安排创建当前密钥列表:

     SELECT src_primary_key
       FROM Source
      WHERE src_primary_key IN (SELECT tgt_primary_key FROM Target)
       INTO TEMP Present_Keys;
    
    DELETE FROM Target
     WHERE tgt_primary_key IN (SELECT src_primary_key FROM Present_Keys)
    
    INSERT INTO Target
        SELECT * FROM Source
         WHERE src_primary_key IN (SELECT src_primary_key FROM Present_Keys)
    

    为了安全起见,所有这些都必须在事务中完成,当然 — 可能在 REPEATABLE READ 隔离中实现最大安全性。

可能还有其他方法可以做到这一点,但这大致模拟了 MERGE 语句将执行的步骤。在处理“丢失的键”之前,您可能需要处理“当前键”(因此在执行第 4 步后执行第 3 步)。您可能还会考虑是否简单地从 Target 中删除所有与 Source 中的行匹配的行,然后简单地将 Source 的内容插入到 Target 中:

BEGIN WORK;
DELETE FROM Target
 WHERE tgt_primary_key IN (SELECT src_primary_key FROM Source);
INSERT INTO Target SELECT * FROM Source;
COMMIT WORK;

【讨论】:

如果您仍在使用 Informix 的任何版本 10 或 11,您应该真正升级,最好升级到版本 14.10,可能升级到 12.10(但那是在其维护周期的尾端——您应该真的升级到 14.10)。

以上是关于如何在没有 MERGE 语句的情况下执行 Update else Insert 操作 win INFORMIX的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的merge()方法

无法在没有可用于分区消除的过滤器的情况下查询表

如何在 oracle 19c 的 MERGE 语句中使用提交?

SSIS 执行 SQL 任务,受 MERGE 语句影响的行(Oracle 和 SQL Server)

自我更新应用

hibernate中如何使用merge()用法举例