繁体   English   中英

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

[英]Merging two tables where unique key comprises multiple columns

我有两个表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中存在了吗?

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为空(3个键列上的联接在B表中没有对应的值)

您可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM