首页 文章

如何覆盖informix sql中“load from”语句中的匹配键

提问于
浏览
2

我有一个表(在informix中),它存储两列:empId和status(Y / N) . 还有一些其他脚本在运行时会根据特定条件更新这些employeeID的状态 . 手头的任务是,用户提供包含employee-ID的文件的路径 . 我有一个脚本,然后查看此文件并执行“从user_supplied_file加载到employeeStatusTable” . 此文件中提到的所有employeeID都将插入此表中,状态为“N” . 真正的问题是用户提供的文件可能包含已存在于表中的employeeId,其状态已更新为“Y”(通过某些其他脚本或作业) . 在这种情况下,现有条目应该被覆盖 . 简而言之,表中的条目应为“empId”,“N” .

有没有办法实现这个?提前致谢 .

1 回答

  • 3

    据我所知,LOAD语句仅限于使用INSERT语句 . 我很确定有很多方法可以做到这一点,我会建议两种方式:

    在这两种情况下,仅支持数据库版本> = 11.50并且具有某些限制,例如:

    • 仅当两个表具有1对1关系时,合并才有效

    • 外部表仅限于数据库服务器文件系统,不会访问客户端计算机上的任何内容

    建议1

    加载到临时表中,然后使用MERGE语句 .

    create temp table tp01 ( cols.... ) with no log ; 
    load from xyz.txt insert into tp01 ; 
    merge into destTable as A
      using tp01 as B 
      ON A.empID = B.empID
      WHEN MATCHED THEN UPDATE SET status = 'N'
      WHEN NOT MATCHED THEN INSERT (empid, status) values ( b.empid, 'N');
    drop table tp01;
    

    建议2

    创建external table到您的TXT文件,然后在需要时使用此表使用MERGE或UPDATE .

    create external table ex01 .... using ( datafile('file:/tmp/your.txt'), delimited ...);
    merge into destTable as A
      using ex01 as B 
      ON A.empID = B.empID
      WHEN MATCHED THEN UPDATE SET status = 'N'
      WHEN NOT MATCHED THEN INSERT (empid, status) values ( b.empid, 'N');
    

相关问题