gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:13:29 27 4
gpt4 key购买 nike

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

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

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com