你如何比较MySQL中的3个表和1个表?



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

我有1个主文件和3个源文件,我们称它们为master, src1, src2和src3。主文件应该具有与3个源文件组合相同的记录,然而,主文件的记录比所有3个源文件的记录总和还要多。我的目标是验证src1-3中的所有记录都在主文件中,并且还从主文件中提取不在3个源中的任何1中的记录。此外,这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中的每个不同记录在主文件中至少有一个不同的匹配。但是,在这个挑战的后半部分,我必须从主文件中选择没有相应匹配的记录。

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

感谢所有的帮助。

首先,使用UNION ALL获取所有匹配行和仅包含在src1-3表中的行。接下来,通过连接tmp1表,获得master表中仅包含在master表中的行。参考以下查询:

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

db小提琴

最新更新