插入/选择,除非某些列中的值匹配

问题描述 投票:0回答:1

我有:

表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 键之外的所有内容。不过我想要,

  • 如果 value1a = value1b、value3a = value3b 且 value4a = value4b,则不插入
  • 如果 value1a = value1b、value3a = value3b 且 value4a != value4b 则插入

现在我只需删除以 111 作为 value3b 的所有内容,然后重新插入所有内容以解决重复项。然而我现在需要保留超过 1 个值4b

sql sql-server sql-insert
1个回答
0
投票

不清楚是否插入TableA中根本不存在的行。这是唯一可能的条件:

如果 value1a = value1b、value3a = value3b 且 value4a != value4b 则 DO 插入 *我还使用了平面列名,因为逻辑不完全清晰,并且示例查询无效(TableB 中不存在列 value4a)

这可以通过以下方式实现:

  1. 存在(或不存在):

    插入表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 )

  2. 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 不为空

  3. 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);

© www.soinside.com 2019 - 2024. All rights reserved.