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

Sql 如何在没有MERGE语句的情况下执行Update-else-Insert操作win-INFORMIX,sql,informix,insert-update,merge-statement,Sql,Informix,Insert Update,Merge Statement,假设我有两个表——Source和Target。我试图从源加载目标表,只有当记录不在目标表中时,才应插入该记录,否则应更新该记录。比较时应考虑所有列。Informix中除了Merge语句之外还有其他可用选项。现在,Informix 10.00(或11.50.xC6之前的任何版本)中没有Merge语句 没有一个简单的解决方法 在大纲中,最接近的近似值为: 识别源表和目标表中的主键列-我将假设它们是名称为src_primary_key和tgt_primary_key的单列键。如果它们是多列键,生活会更

假设我有两个表——Source和Target。我试图从源加载目标表,只有当记录不在目标表中时,才应插入该记录,否则应更新该记录。比较时应考虑所有列。Informix中除了Merge语句之外还有其他可用选项。

现在,Informix 10.00(或11.50.xC6之前的任何版本)中没有Merge语句

没有一个简单的解决方法

在大纲中,最接近的近似值为:

  • 识别源表和目标表中的主键列-我将假设它们是名称为
    src_primary_key
    tgt_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)
    
  • 当然,为了安全,所有这些都必须在事务内部完成——可能是在可重复读取隔离中实现最大安全性

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

    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.00(或11.50.xC6之前的任何版本)中没有MERGE语句

    没有一个简单的解决方法

    在大纲中,最接近的近似值为:

  • 识别源表和目标表中的主键列-我将假设它们是名称为
    src_primary_key
    tgt_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)
    
  • 当然,为了安全,所有这些都必须在事务内部完成——可能是在可重复读取隔离中实现最大安全性

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

    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版)。如果您仍在使用Informix的任何版本10或11,您应该真正升级,最好是升级到14.10版,可能会升级到12.10(但这已经是它的维护周期的末尾了-你真的应该升级到14.10)。