繁体   English   中英

使用mysql将丢失的记录从一张表插入到另一张表

[英]Insert missing records from one table to another using mysql

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

我有两个表: Table A900条记录, Table B800条记录。 两个表都需要包含相同的数据,但存在一些不匹配。

我需要编写一个 mysql 查询来将缺少的100条记录从Table A插入到Table B

最后, Table ATable B应该是相同的。

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

谢谢你。

也可以为此使用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不存在的行, B表的所​​有列都将为NULL 然后它只过滤后面的行( WHERE b.id IS NULL ),最后将所有这些行插入到B表中。

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

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

SQLFiddle 演示

正如您在演示中看到的, table2只有 1 条记录,但在执行查询后, 2 条记录插入到table2

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

REPLACE INTO table1 SELECT * FROM table2;

当使用group byhaving子句时,代码也有效。 测试 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(hits) MaxHit,SUM(count) SumCnt, count(distinct(week)) WkCnt
FROM 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  and b.val3 = a.val3  and b.val4 = a.val4 
WHERE b.t1 IS NULL or b.Val1 is NULL
group by a.T1,a.T2,a.T3,a.T4,a.Val1,a.Val2,a.Val3,a.Val4 having MAX(returns)<4 and COUNT(distinct(week))>2 ;

这会将丢失的记录插入到 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

暂无
暂无

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

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