合并两个表,其中唯一键包含多个列

时间:2012-11-22 11:19:25

标签: mysql sql tandem hp-nonstop

我有两个表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中不存在相应的三列密钥?

2 个答案:

答案 0 :(得分: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个键上的连接)

答案 1 :(得分: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
        )

虽然根据this 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