合并两个表,其中唯一键包含多个列
问题描述:
我有两个表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为空
+0
聪明的想法,它完美的作品。谢谢! – Philip
答
你可以使用NOT EXISTS
(B中表的加入对3个键列没有相应的值)而不是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
请让我知道这两个表的列 – Chella
@Chella:你需要名称还是各自的类型? – Philip