使用mysql将缺失的记录从一个表插入另一个表

时间:2012-10-24 16:02:25

标签: mysql sql

我不知道为什么我对此查询感到困惑。

我有两张桌子

表A有900条记录。 表B有800条记录。

两个表都需要包含相同的数据,但存在一些不匹配。

我需要编写一个mysql查询,将表A中缺少的100条记录插入到表B中。

最后,表A和表B应该相同。

我不想先截断所有条目,然后从另一个表中插入。所以,请任何帮助表示赞赏。

谢谢。

5 个答案:

答案 0 :(得分:17)

也可以使用LEFT OUTER JOIN。这将避免子查询开销(当系统可能为外部查询的每个记录执行一次子查询时),如John Woo的答案,并且将避免做不必要的工作,覆盖现有的800条记录,如user2340435的一个:

INSERT INTO b
SELECT a.* FROM a
LEFT OUTER JOIN b ON b.id = a.id
WHERE b.id IS NULL;

这将首先从AB表中选择所有行,包括两个表中的所有列,但对于A中存在的行并且不存在于{B中的行1}} B表的所有列都是NULL。 然后它只过滤后面这些行(WHERE b.id IS NULL), 最后,它将所有这些行插入B表。

答案 1 :(得分:5)

我认为您可以使用IN。 (这是您的查询的简化

INSERT INTO table2 (id, name)
SELECT id, name
FROM table1
WHERE (id,name) NOT IN 
       (SELECT id, name
        FROM table2);

SQLFiddle Demo

您可以在演示中看到,table2只有1条记录,但在执行查询后,table2上插入了2条记录。

答案 2 :(得分:2)

如果它是mysql且表格相同,那么这应该有效:

REPLACE INTO table1 SELECT * FROM table2;

答案 3 :(得分:0)

当使用group by和having子句时,代码也有效。经过测试的SQL 2012(11.0.5058)Tab1是具有新记录的源,Tab 2是要更新的目标。标签2还有一个标识列。 (是的,现实世界并不像实验室作业那样整洁干净)

INSERT INTO Tab2 SELECT a.T1,a.T2,a.T3,a.T4,a.Val1,a.Val2,a.Val3,a.Val4,-9,-9,-9,-9,MIN(hits)MinHit ,MAX(命中)MaxHit,SUM(计数)SumCnt,count(distinct(week))WkCnt 来自Tab1 a LEFT OUTER JOIN Tab2 b ON b.t1 = a.t1 and b.t2 = a.t2 and b.t3 = a.t3 and b.t4 = a.t4 and b.val1 = a.val1 and b.val2 = a.val2和b.val3 = a.val3和b.val4 = a.val4 WHERE b.t1 IS NULL或b.Val1为NULL a.T1,a.T2,a.T3,a.T4,a.Val1,a.Val2,a.Val3,a.Val4的组具有MAX(返回)< 4和COUNT(distinct(week))> ; 2;

答案 4 :(得分:0)

这会将缺失的记录插入Table1

INSERT INTO Table2
(Col1, Col2....)
(
SELECT   Col1, Col2,... FROM Table1
EXCEPT
SELECT  Col1, Col2,... FROM Table2
)

然后,您可以运行更新查询以匹配不同的记录。

UPDATE Table2
SET
Col1= T1.Col1,
Col2= T1.Col2,
FROM
Table T1
INNER JOIN
Table2 T2
ON
T1.Col1 = T2.Col1