1回答

0收藏

MySQL比较两个表不同的数据

Mysql专区 Mysql专区 924 人阅读 | 1 人回复 | 2021-09-04

在本教程中,您将学习如何比较两个表以找到不匹配的记录。
在数据迁移中,我们经常需要比较两个表,以便在一个表中标识另一个表中没有相应记录的记录。
例如,我们有一个新的数据库,其架构与旧数据库不同。我们的任务是将所有数据从旧数据库迁移到新数据库,并验证数据是否正确迁移。
要检查数据,我们必须比较两个表,一个在新数据库中,一个在旧数据库中,并标识不匹配的记录。
假设有两个表:t1和t2。使用以下步骤比较两个表,并确定不匹配的记录:
首先,使用UNION语句来组合两个表中的行; 仅包含需要比较的列。返回的结果集用于比较。
[SQL] 纯文本查看 复制代码
SELECT t1.pk, t1.c1
FROM t1
UNION ALL
SELECT t2.pk, t2.c1
FROM t2

SQL

第二步,根据需要比较的主键和列分组记录。如果需要比较的列中的值相同,则COUNT(*)返回2,否则COUNT(*)返回1。
请参阅以下查询:
[SQL] 纯文本查看 复制代码
SELECT pk, c1
FROM
 (
   SELECT t1.pk, t1.c1
   FROM t1
   UNION ALL
   SELECT t2.pk, t2.c1
   FROM t2
)  t
GROUP BY pk, c1
HAVING COUNT(*) = 1
ORDER BY pk

SQL

如果比较中涉及的列中的值相同,则不返回任何行。
MySQL比较两个表的例子我们来看一个模拟上述步骤的例子。
首先,创建具有相似结构的2个表:
[SQL] 纯文本查看 复制代码
USE testdb;
CREATE TABLE t1(
 id int auto_increment primary key,
    title varchar(255) 
);

CREATE TABLE t2(
 id int auto_increment primary key,
    title varchar(255),
    note varchar(255)
);

SQL

其次,在t1和t2表中插入一些数据:
[SQL] 纯文本查看 复制代码
INSERT INTO t1(title) VALUES('row 1'),('row 2'),('row 3');

INSERT INTO t2(title,note)
SELECT title, 'data migration'
FROM t1;

SQL

第三,比较两个表的id和title列的值:
[SQL] 纯文本查看 复制代码
ELECT id,title FROM (SELECT id, title FROM t1 UNION ALL SELECT id,title FROM t2) tbl GROUP BY id, title HAVING count(*) = 1 ORDER BY id;

SQL

没有行返回,因为没有不匹配的记录。
第四,在t2表中插入一行:
[SQL] 纯文本查看 复制代码
INSERT INTO t2(title,note) VALUES('new row 4','new');

SQL

没有行返回,因为没有不匹配的记录。
第四步,在t2表中插入一行:…
[SQL] 纯文本查看 复制代码
INSERT INTO t2(title,note)
VALUES('new row 4','new');

SQL

第五步,执行查询以再次比较两个表中的title列的值。新行是不匹配的行将会返回。
[SQL] 纯文本查看 复制代码
mysql> SELECT id,title
FROM (
    SELECT id, title FROM t1
    UNION ALL
    SELECT id,title FROM t2
) tbl
GROUP BY id, title
HAVING count(*) = 1
ORDER BY id;
+----+-----------+
| id | title     |
+----+-----------+
|  4 | new row 4 |
+----+-----------+
1 row in set


分享到:
回复

使用道具 举报

回答|共 1 个

Gregoryzilla

发表于 2024-10-30 10:02:47 | 显示全部楼层

инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо  
инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо  
инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инйо инфо инфо  
инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо  
инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо  
инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо  
инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо  
инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо инфо
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

351 积分
40 主题