2

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

有没有办法实现这一点?提前致谢。

4

1 回答 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

为您的 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');
于 2013-01-30T15:32:41.090 回答