没有MERGE语句的win INFORMIX如何执行Update else Insert操作
How to perform Update else Insert Operation win INFORMIX without MERGE Statement
假设我有两个 tables - 源和目标。我正在尝试从源加载目标 table,只有当记录不存在于目标 table 中时才应插入记录,否则应更新记录。应该考虑所有列进行比较。除了 Merge 语句之外,Informix 中是否还有可用的选项。
正如您现在 ,Informix 10.00(或 11.50.xC6 之前的任何版本)中不存在 MERGE 语句。
没有简单的解决方法。
概括地说,最接近的近似值是:
确定源和目标 table 中的主键列——我假设它们是 single-column 键,名称为 src_primary_key
并且tgt_primary_key
。如果它们是 multi-column 键,生活会更加复杂,但并非不可逾越。
通常,您将使用以下方法插入缺失的记录:
INSERT INTO Target
SELECT *
FROM Source
WHERE src_primary_key NOT IN (SELECT tgt_primary_key FROM Target)
但是,您可能 运行 违反了从 table 中选择的限制,因此您最终会这样做:
SELECT src_primary_key
FROM Source
WHERE src_primary_key NOT IN (SELECT tgt_primary_key FROM Target)
INTO TEMP Missing_Keys
INSERT INTO Target
SELECT *
FROM Source
WHERE src_primary_key IN (SELECT src_primary_key FROM Missing_Keys)
由于您希望更新替换现有数据,因此您安排创建一个现有密钥列表:
SELECT src_primary_key
FROM Source
WHERE src_primary_key IN (SELECT tgt_primary_key FROM Target)
INTO TEMP Present_Keys;
DELETE FROM Target
WHERE tgt_primary_key IN (SELECT src_primary_key FROM Present_Keys)
INSERT INTO Target
SELECT * FROM Source
WHERE src_primary_key IN (SELECT src_primary_key FROM Present_Keys)
为了安全起见,所有这些都必须在事务内完成,当然——可能在可重复读取隔离中以获得最大安全性。
可能还有其他方法可以做到这一点,但这粗略地模拟了 MERGE 语句将经历的步骤。您可能需要在处理 'Missing Keys' 之前处理 'Present Keys' (因此在执行步骤 4 之后执行步骤 3)。您可能还会考虑是否简单地从 Target 中删除所有与 Source 中的一行匹配的行,然后简单地将 Source 的内容插入到 Target 中:
BEGIN WORK;
DELETE FROM Target
WHERE tgt_primary_key IN (SELECT src_primary_key FROM Source);
INSERT INTO Target SELECT * FROM Source;
COMMIT WORK;
假设我有两个 tables - 源和目标。我正在尝试从源加载目标 table,只有当记录不存在于目标 table 中时才应插入记录,否则应更新记录。应该考虑所有列进行比较。除了 Merge 语句之外,Informix 中是否还有可用的选项。
正如您现在
没有简单的解决方法。
概括地说,最接近的近似值是:
确定源和目标 table 中的主键列——我假设它们是 single-column 键,名称为
src_primary_key
并且tgt_primary_key
。如果它们是 multi-column 键,生活会更加复杂,但并非不可逾越。通常,您将使用以下方法插入缺失的记录:
INSERT INTO Target SELECT * FROM Source WHERE src_primary_key NOT IN (SELECT tgt_primary_key FROM Target)
但是,您可能 运行 违反了从 table 中选择的限制,因此您最终会这样做:
SELECT src_primary_key FROM Source WHERE src_primary_key NOT IN (SELECT tgt_primary_key FROM Target) INTO TEMP Missing_Keys INSERT INTO Target SELECT * FROM Source WHERE src_primary_key IN (SELECT src_primary_key FROM Missing_Keys)
由于您希望更新替换现有数据,因此您安排创建一个现有密钥列表:
SELECT src_primary_key FROM Source WHERE src_primary_key IN (SELECT tgt_primary_key FROM Target) INTO TEMP Present_Keys; DELETE FROM Target WHERE tgt_primary_key IN (SELECT src_primary_key FROM Present_Keys) INSERT INTO Target SELECT * FROM Source WHERE src_primary_key IN (SELECT src_primary_key FROM Present_Keys)
为了安全起见,所有这些都必须在事务内完成,当然——可能在可重复读取隔离中以获得最大安全性。
可能还有其他方法可以做到这一点,但这粗略地模拟了 MERGE 语句将经历的步骤。您可能需要在处理 'Missing Keys' 之前处理 'Present Keys' (因此在执行步骤 4 之后执行步骤 3)。您可能还会考虑是否简单地从 Target 中删除所有与 Source 中的一行匹配的行,然后简单地将 Source 的内容插入到 Target 中:
BEGIN WORK;
DELETE FROM Target
WHERE tgt_primary_key IN (SELECT src_primary_key FROM Source);
INSERT INTO Target SELECT * FROM Source;
COMMIT WORK;