假设我有两个表 - 源和目标。我正在尝试从源加载目标表,并且仅当目标表中不存在该记录时才应插入该记录,否则应对其进行更新。应考虑所有列进行比较。除了 Merge 语句之外,Informix 中是否还有其他可用选项。
问问题
63 次
1 回答
0
如您所知,在 Informix 10.00(或 11.50.xC6 之前的任何版本)中不存在 MERGE 语句。
没有简单的解决方法。
概括地说,最接近的近似值是:
识别源表和目标表中的主键列——我假设它们是具有名称
src_primary_key
和tgt_primary_key
. 如果它们是多列键,则生活会更加复杂,但并非无法克服。名义上,您将使用以下方法插入丢失的记录:
INSERT INTO Target SELECT * FROM Source WHERE src_primary_key NOT IN (SELECT tgt_primary_key FROM Target)
但是,您可能违反了从您也插入的表中进行选择的限制,因此您最终会这样做:
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)
当然,所有这些都必须在事务中完成以确保安全——可能在 REPEATABLE READ 隔离中实现最大安全性。
可能还有其他方法可以做到这一点,但这松散地模拟了 MERGE 语句将经历的步骤。在处理“丢失的密钥”之前,您可能需要处理“当前密钥”(因此在执行第 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;
于 2020-11-01T18:57:27.063 回答