首页 > 解决方案 > 确保不同表中的 2 列逐行相同 MySQL

问题描述

我希望逐行比较两个不同的表,以确保文件名和与文件名关联的计数都匹配。如果其中一个不匹配,我想输出不匹配的两行。

我正在使用 MySQL 作为我的数据库进行操作

例如

Expected                      Actual
FileName    Count             FileName    Count
name1.txt    4                name1.txt    4
name2.txt    7                name2.txt    7
name3.txt    4                name4.txt    4  (invalid filename)
name5.txt    4                name5.txt    5  (invalid count)

Output:
The fOllowing rows did not match:
Expected:                     Actual:
name3.txt    4                name4.txt    4 (because of filename)
name5.txt    4                name5.txt    5 (because counts are diff)

这样做的目的是为了验证脚本。有两张表,一张用于预期结果,一张用于实际结果。sql是比较每个表中的行,以确保它们是相同的。每个表中有 4 列。对于要被视为“相同”的表,必须在两个表中找到文件名和与该文件名关联的计数。如果这没有发生,我想输出无法找到匹配项的行。

标签: mysqlsql

解决方案


你想要NOT EXISTS

表格1 :

SELECT t1.* 
FROM table1 t1
WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t2.filename = t1.filename AND t1.count = t2.count);

表2:

SELECT t2.* 
FROM table2 t2
WHERE NOT EXISTS (SELECT 1 FROM table1 t1 WHERE t2.filename = t1.filename AND t1.count = t2.count);

如果要将它们整理为一个结果集,请使用union all

SELECT t1.filename, t1.count, 'table1' as table_name
FROM table1 t1
WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t2.filename = t1.filename AND t1.count = t2.count)
UNION ALL
SELECT t2.filename, t2.count, 'table2'
FROM table2 t2
WHERE NOT EXISTS (SELECT 1 FROM table1 t1 WHERE t2.filename = t1.filename AND t1.count = t2.count); 

推荐阅读