sql - 如何覆盖informix sql中 "load from"语句中的匹配键

标签 sql informix insert-update

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

有什么办法可以达到这个目的吗?提前致谢。

最佳答案

据我所知,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 文件,然后在需要时使用此表进行合并或更新。

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');

关于sql - 如何覆盖informix sql中 "load from"语句中的匹配键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14602369/

相关文章:

sql - COPY INTO <table> in snowflake throws 表不存在

mysql - 如何同步两个MySQL表?

sql - 带表达式的 ORDER By 子句

perl - 如何在 Perl 的 DBI 中正确表示空格

SQL Informix 12.10FC6 - 一次转换多列多列,但不创建用户定义类型

mysql - 总是在 SQL 中的最后一个条目之后将新数据插入表中

c# - 如何存储IGoogle组件的个性化设置?

php - 如果记录相同则更新 SQL 行

sql - Firebird 2.5 更新或插入

xml - 批量更新xml文件