如何使用SQL快速筛选出两张表中不一致的数据?

55 阅读3分钟

一、场景复现

不知道大家在日常工作过程中有没有遇到这样的问题,别人发你一个1.1版本的Excel数据表格,然后你自己电脑上保留的事1.0版本的,那这个两个版本不一致,再加上Excel又没有溯源的机制。那么,你应该如何定位到1.0版本与1.1版本的数据表格之间做了哪些改动呢?

前提:这里的改动是只针对数据进行的改动,表头也就是字段是没有发生改动的

二、分析与解决

遇到这种场景问题,也许你会很熟练的进行各种VLOOKUP进行分析,亦或者说是直接去问1.1版本的作者他改动了啥,当然这其中又是免不了一番拉扯,那么有没有一种快速而又简洁且不需要求人的方法呢?答案当然是有的。如果你会使用数据库的话,那我直接可以使用SQL语句来进行关联查询即可。

解决过程如下:

第一步

首先,先安装一个MySQL的数据库,这里怎么安装的我就不再赘述了,可以看我之前发表的文章

第二步

安装完成之后,将Excel数据表格导入到MySQL中,这里我首先准备了一个V1.0版本的数据

然后我对第一行的数据在后面增加了一个128G

然后分别将两个版本的数据集导入到MySQL,形成两个表

第三步:编写SQL直接查询出结果

-- 在t1表中有,t2表中没有的数据
SELECT * FROM test.`order_v1.0` t1
WHERE NOT EXISTS (
    SELECT 1 FROM test.`order_v2.0` t2 
    WHERE 
    t1.`行 ID`  = t2.`行 ID`AND
    t1.`订单 ID`  = t2.`订单 ID`AND
    t1.`订单日期`  = t2.`订单日期`AND
    t1.`发货日期`  = t2.`发货日期`AND
    t1.`邮寄方式`  = t2.`邮寄方式`AND
    t1.`客户 ID`  = t2.`客户 ID`AND
    t1.`客户名称`  = t2.`客户名称`AND
    t1.`细分`  = t2.`细分`AND
    t1.`城市`  = t2.`城市`AND
    t1.`省/自治区`  = t2.`省/自治区`AND
    t1.`国家/地区`  = t2.`国家/地区`AND
    t1.`地区`  = t2.`地区`AND
    t1.`产品 ID`  = t2.`产品 ID`AND
    t1.`类别`  = t2.`类别`AND
    t1.`子类别`  = t2.`子类别`AND
    t1.`产品名称`  = t2.`产品名称`AND
    t1.`销售额`  = t2.`销售额`AND
    t1.`数量`  = t2.`数量`AND
    t1.`折扣`  = t2.`折扣`AND
    t1.`利润`  = t2.`利润`
)
UNION ALL
-- 在t2表中有,t1表中没有的数据
SELECT * FROM test.`order_v2.0` t2
WHERE NOT EXISTS (
    SELECT 1 FROM test.`order_v1.0` t1 
    WHERE 
    t1.`行 ID`  = t2.`行 ID`AND
    t1.`订单 ID`  = t2.`订单 ID`AND
    t1.`订单日期`  = t2.`订单日期`AND
    t1.`发货日期`  = t2.`发货日期`AND
    t1.`邮寄方式`  = t2.`邮寄方式`AND
    t1.`客户 ID`  = t2.`客户 ID`AND
    t1.`客户名称`  = t2.`客户名称`AND
    t1.`细分`  = t2.`细分`AND
    t1.`城市`  = t2.`城市`AND
    t1.`省/自治区`  = t2.`省/自治区`AND
    t1.`国家/地区`  = t2.`国家/地区`AND
    t1.`地区`  = t2.`地区`AND
    t1.`产品 ID`  = t2.`产品 ID`AND
    t1.`类别`  = t2.`类别`AND
    t1.`子类别`  = t2.`子类别`AND
    t1.`产品名称`  = t2.`产品名称`AND
    t1.`销售额`  = t2.`销售额`AND
    t1.`数量`  = t2.`数量`AND
    t1.`折扣`  = t2.`折扣`AND
    t1.`利润`  = t2.`利润`
)

很容易我们就能筛选并定位到发生改变的具体位置,还是很方便的。# 如何使用SQL快速筛选出两张表中不一致的数据?