【MySQL】比较两个表中差异数据并将差异数据插入另一张表中

深度链接 / 2023-12-06 21:48:19 / 174

最近做项目是遇到需要找出两个表中的差异数据,查找相关资料得知可以使用not exsits刷选出差异数据。本问题可以分解为两步,第一步是找出差异数据,第二步将差异数据插入表中。

1、问题

比较table1和table2两个表中数据差异,将差异数据插入table3中。table1、table2、table3表结构相同,差异数据需要比较type、key、value三个字段
table1中数据如下:
mysql> select * from table1;
+----+------+--------------------+-------+------+
| id | type | key                | value | desc |
+----+------+--------------------+-------+------+
|  1 | 1    | 19353600611478353H | 91    | NULL |
|  2 | 1    | 19353400733629439Y | 74    | NULL |
|  3 | 1    | 1935310026017260XP | 58    | NULL |
|  4 | 1    | 1935320066474298XL | 85    | NULL |
|  5 | 1    | 19353500665066864F | 70    | NULL |
|  6 | 1    | 19353200751605000A | 63    | NULL |
|  7 | 1    | 19353600587527169N | 58    | NULL |
|  8 | 1    | 19353200612261252T | 65    | NULL |
|  9 | 1    | 193532005562039629 | 75    | NULL |
| 10 | 1    | 19353200155011310C | 66    | NULL |
+----+------+--------------------+-------+------+

table2中数据如下:
mysql> select * from table2;
+----+------+--------------------+-------+------+
| id | type | key                | value | desc |
+----+------+--------------------+-------+------+
|  1 | 1    | 19353600611478353H | 91    | NULL |
|  2 | 1    | 19353400733629439Y | 74    | NULL |
|  3 | 1    | 1935310026017260XP | 58    | NULL |
|  4 | 1    | 1935320066474298XL | 85    | NULL |
+----+------+--------------------+-------+------+

2、分析及解决方法

本问题可以分解为两步,第一步是找出差异数据,使用not exsits刷选出差异数据;第二步将差异数据插入表中。
a、刷选出两表差异数据
mysql> SELECT `desc`,`value`,`type`,`key` FROM table1 WHERE NOT EXISTS ( SELECT `desc`,`value`,`type`,`key` FROM table2 WHERE table2.key = table1.key AND table2.value = table1.value AND table2.type = table1.type);
+----+------+--------------------+-------+------+
| id | type | key                | value | desc |
+----+------+--------------------+-------+------+
|  5 | 1    | 19353500665066864F | 70    | NULL |
|  6 | 1    | 19353200751605000A | 63    | NULL |
|  7 | 1    | 19353600587527169N | 58    | NULL |
|  8 | 1    | 19353200612261252T | 65    | NULL |
|  9 | 1    | 193532005562039629 | 75    | NULL |
| 10 | 1    | 19353200155011310C | 66    | NULL |
+----+------+--------------------+-------+------+

b、刷选出两表差异数据并插入table3中
mysql> INSERT INTO table3(`desc`,`value`,`type`,`key`) SELECT `desc`,`value`,`type`,`key` FROM table1 WHERE NOT EXISTS ( SELECT `desc`,`value`,`type`,`key` FROM table2 WHERE table2.key = table1.key AND table2.value = table1.value AND table2.type = table1.type);

c、查看table3中数据
mysql> select * from table3;
+----+------+--------------------+-------+------+
| id | type | key                | value | desc |
+----+------+--------------------+-------+------+
|  1 | 1    | 19353500665066864F | 70    | NULL |
|  2 | 1    | 19353200751605000A | 63    | NULL |
|  3 | 1    | 19353600587527169N | 58    | NULL |
|  4 | 1    | 19353200612261252T | 65    | NULL |
|  5 | 1    | 193532005562039629 | 75    | NULL |
|  6 | 1    | 19353200155011310C | 66    | NULL |
+----+------+--------------------+-------+------+