首页 > 解决方案 > 您如何将 3 个表与 MySQL 中的 1 个表进行比较?

问题描述

所以我有一个可能很愚蠢的问题,但我正在寻找解决以下问题的基本方法或策略。

我有 1 个主文件和 3 个源文件,我们称它们为 master、src1、src2 和 src3。主文件应该与 3 个源文件的组合具有相同的记录,但是,主文件的记录多于所有 3 个源文件的总和。我的目标是验证 src1-3 中的所有记录都在主文件中,并且还从主文件中提取不在 3 个源中的任何一个中的记录。此外,这 4 个文件中的每一个都有不同(但相似)的标题

我已经能够从 src1 (和后续来源)中找到不同的记录,并使用以下命令将其映射到主文件中的匹配记录:

WITH tmp1 AS (
 SELECT src1.*
 FROM src1 as s1
 LEFT JOIN master as mstr
 ON (
  s1.name = mstr.fname
  s1.quant = mstr.qty
  s1.item = mstr.obj
  s1.price = mstr.prc
  s1.age = mstr.time_since_dob
 )
) SELECT DISTINCT primaryKey from tmp1; 

使用它,我可以获得 src1 中存在的两个文件之间不同匹配的计数,如果这与计数匹配,select distinct PK from src1那么我的状态就不错了。虽然,我知道使用上面的标准我可以很容易地得到很多冲突,因为几个记录可能有相同的名称、数量、项目、价格等......但我只想说,使用上述标准我可以得到唯一的匹配,因为两个表之间没有匹配的 ID 或类似的东西。此外,每个来源的加入标准略有不同,因此我必须单独执行上述 3 次并独立验证每个来源。

完成上述以及其他一些分析后,我已经能够验证来自 src1-3 的每个不同记录在主文件中至少有 1 个不同的匹配项。但是,我遇到了这个挑战的后半部分的问题,我必须从主文件中选择没有相应匹配项的记录。

如何从主文件中选择那些不匹配的记录?我可以做一个简单 select * from master not in newView1的 newView1 是 3 个源的 3 个选择的组合吗?同样,我为每个连接条件使用不同的列,因此将 3 个源放在同一个标​​题下可能很困难(但值得追求吗?)。另一件值得一提的是,每个文件约为 1gb,主文件约为 3gb,因此时间复杂度值得考虑。

感谢所有和任何帮助。

标签: mysqlsql

解决方案


首先,UNION ALL用于获取所有匹配的行和仅包含在src1-3表中的行。接下来,通过加入表来获取master仅包含在表中的表的行。请参阅以下查询:mastertmp1

with tmp1(tbl,name,quant,item,price,age,fname,qty,obj,prc,time_since_dob) as (
select 'src1',s1.*,m.* from src1 s1 left join master1 m on
    s1.name=m.fname and
    s1.quant=m.qty and
    s1.item=m.obj and 
    s1.price=m.prc and
    s1.age=m.time_since_dob
union all
select 'src2',s2.*,m.* from src2 s2 left join master1 m on
    s2.name=m.fname and
    s2.quant=m.qty and
    s2.item=m.obj and 
    s2.price=m.prc and
    s2.age=m.time_since_dob
union all
select 'src3',s3.*,m.* from src3 s3 left join master1 m on
    s3.name=m.fname and
    s3.quant=m.qty and
    s3.item=m.obj and 
    s3.price=m.prc and
    s3.age=m.time_since_dob
)
select 'master',m.fname,m.qty,m.obj,m.prc,m.time_since_dob from master1 m left join tmp1 t on
    m.fname=t.name and
    m.qty=t.quant and
    m.obj=t.item and 
    m.prc=t.price and
    m.time_since_dob=t.age
where t.name is null
union all
select t.tbl,t.name,t.quant,t.item,t.price,t.age from tmp1 t
where t.fname is null

分贝小提琴


推荐阅读