0

我有两个表 A 和 B(具有相同的架构),我想通过将 A 中的所有条目插入 B 来合并它们。如果表 B 已经有与 A 中的键关联的数据,我想静默删除这些数据。

问题是表 B 有一个由三列组成的唯一键索引,所以我不能只说“ WHERE A.key <> B.key”。

我似乎无法按照以下方式制定 SQL 语句:

INSERT INTO B 
VALUES ((SELECT * FROM A WHERE ... NOT IN ...))

有没有办法将INSERT那些从 A 到 B 的行在 B 中不存在相应的三列键?

4

2 回答 2

2
INSERT INTO B 
(Col1, Col2, Col3, ColN)
SELECT
A.Col1, A.Col2, A.Col3, COlN
FROM A
LEFT JOIN B
ON A.COL1 = B.Col1
AND A.COL2 = B.Col2
AND A.COL3 = B.Col3
WHERE B.Col1 IS NULL

本质上用左连接连接 2 个表,并从 A 插入所有 B 为空的表(B 表中没有对应值用于 3 个键列上的连接)

于 2012-11-22T11:24:41.573 回答
1

你可以使用NOT EXISTS而不是NOT IN

INSERT B
SELECT  *
FROM    A
WHERE   NOT EXISTS
        (   SELECT  1
            FROM    B
            WHERE   A.Key1 = B.Key1
            AND     A.Key2 = B.Key2
        )

虽然根据这个MySQL 优化LEFT JOIN/IS NULL比不存在更好:

INSERT B
SELECT  A.*
        LEFT JOIN B
            ON A.Key1 = B.Key1
            AND A.Key2 = B.Key2
WHERE   B.Key1 IS NULL
于 2012-11-22T11:27:37.023 回答