我不知道为什么我对此查询感到困惑。
我有两张桌子
表A有900条记录。 表B有800条记录。
两个表都需要包含相同的数据,但存在一些不匹配。
我需要编写一个mysql查询,将表A中缺少的100条记录插入到表B中。
最后,表A和表B应该相同。
我不想先截断所有条目,然后从另一个表中插入。所以,请任何帮助表示赞赏。
谢谢。
答案 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;
这将首先从A
和B
表中选择所有行,包括两个表中的所有列,但对于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);
您可以在演示中看到,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