微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何执行更新否则插入操作将在没有MERGE语句的情况下赢得INFORMIX

如何解决如何执行更新否则插入操作将在没有MERGE语句的情况下赢得INFORMIX

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

解决方法

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

没有简单的解决方法。

在轮廓上,最接近的近似值为:

  1. 标识源表和目标表中的主键列-我将假设它们是名称为src_primary_keytgt_primary_key的单列键。如果它们是多列键,则生活会更加复杂,但并非如此。

  2. 名义上,您将使用以下命令插入丢失的记录:

     INSERT INTO Target
         SELECT *
           FROM Source
          WHERE src_primary_key NOT IN (SELECT tgt_primary_key FROM Target)
    
  3. 但是,您可能在从同样要插入的表中进行选择时受到限制,因此最终您会这样做:

     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)
    
  4. 由于您希望更新来替换现有数据,因此您可以安排创建一个当前密钥列表:

     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)
    
  5. 所有这些都必须在事务内完成以确保安全-可能是在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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。