gpt4 book ai didi

mysql - 你如何在 MySQL 中将 3 个表与 1 个表进行比较?

转载 作者:行者123 更新时间:2023-12-04 15:04:57 24 4
gpt4 key购买 nike

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

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

我已经能够从 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,所以时间复杂度值得考虑。

感谢所有的帮助。

最佳答案

首先,使用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 fiddle

关于mysql - 你如何在 MySQL 中将 3 个表与 1 个表进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66327477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com