我有:
表A - 结构不能修改:
autokey | value1a | value2a | value3a | value4a
表 B - 无密钥:
value1b | value2b | value3b | value4b
查询:
INSERT INTO TableA (value1a, value2a, value3a, value4a)
SELECT value1b, NULL AS value2b, 111 AS value3b, value4a AS value4b
FROM TableB
WHERE value1b IS NOT NULL
这工作正常,但因为没有唯一的键意味着它将复制除 autoinc 键之外的所有内容。不过我想要,
现在我只需删除以 111 作为 value3b 的所有内容,然后重新插入所有内容以解决重复项。然而我现在需要保留超过 1 个值4b
不清楚是否插入TableA中根本不存在的行。这是唯一可能的条件:
如果 value1a = value1b、value3a = value3b 且 value4a != value4b 则 DO 插入 *我还使用了平面列名,因为逻辑不完全清晰,并且示例查询无效(TableB 中不存在列 value4a)
这可以通过以下方式实现:
存在(或不存在):
插入表A(值1a,值2a,值3a,值4a) 选择值 1b、值 2b、值 3b、值 4b 来自表B 其中 value1b 不为空 并且存在( 从表 A TA2 中选择 1 在哪里 TA2.value1a = TableB.value1b AND TA2.value3a = TableB.value3b AND TA2.value4a <> TableB.value4b )
JOIN *的行为不同,并且由于表之间存在一对多关系,可能不适合您的情况。
插入表A(值1a,值2a,值3a,值4a) 选择值 1b、值 2b、值 3b、值 4b 来自表B JOIN 表A TA2 ON TA2.value1a = TableB.value1b AND TA2.value3a = TableB.value3b AND TA2.value4a <> TableB.value4b 其中 value1b 不为空
MERGE 这可能是最佳实践,允许处理不同情况以从目标表中插入\更新\删除行。删除“WHEN NOT MATCHED”下的额外条件将允许插入根本不匹配的行。
合并表A作为TGT 使用 TableB 作为 SRC ON TGT.value1a = SRC.value1b AND TGT.value3a = SRC.value3b AND TGT.value4a = SRC.value4b AND SRC.value1b 不为空 --匹配后更新\删除... --如有必要 当不匹配时 AND TGT.value3a = SRC.value3b AND TGT.value4a = SRC.value4b 然后 INSERT(值1a,值2a,值3a,值4a) 值(值 1b、值 2b、值 3b、值 4b);