我有一个表(在 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/