2012-11-22 51 views
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呢?

+0

请让我知道这两个表的列 – Chella

+0

@Chella:你需要名称还是各自的类型? – Philip

回答

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为空

+0

聪明的想法,它完美的作品。谢谢! – Philip

1

你可以使用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 
相关问题