MySQL Workbench关联两表后结果行数异常,请求排查原因
嘿,我来帮你搞定这个问题!首先咱们先揪出最明显的小错误,你的SQL语句里多写了一个on——and on media.sv4=media_1.sv4这里的第二个on是多余的,正确写法应该是and media.sv4=media_1.sv4。不过就算修正了语法,结果行数异常的核心原因是关联键重复导致的笛卡尔积,咱们一步步拆解:
为什么结果行数会“爆炸”?
内连接的本质是匹配两个表中满足条件的行,然后生成所有可能的组合(也就是笛卡尔积)。举个具体的例子:
- 如果
media表中某个(sv3, sv4)组合有200行 - 同时
media_1表中同一个(sv3, sv4)组合有50行
那么这一组匹配后就会产生200 * 50 = 10000行,正好对应你得到的结果数。这说明你的两个表中,至少有一组(sv3, sv4)存在大量重复行。
排查步骤
先修正SQL语法
正确的查询语句应该是:select media.Timestamp, media.Campaign, media.Media, media.sv3, media.sv4 from media inner join media_1 on media.sv3=media_1.sv3 and media.sv4=media_1.sv4检查
media表的重复关联键
运行这个查询,找出media表中重复出现的(sv3, sv4)组合:select sv3, sv4, count(*) as row_count from media group by sv3, sv4 having count(*) > 1 order by row_count desc;检查
media_1表的重复关联键
同样用这个查询排查media_1表:select sv3, sv4, count(*) as row_count from media_1 group by sv3, sv4 having count(*) > 1 order by row_count desc;你大概率会看到某几组的重复数相乘后等于10000,这就是问题的根源。
解决办法
如果你的需求是保留media表的每一行,只要media_1中存在对应的(sv3, sv4)组合即可,不想因为media_1的重复行导致结果膨胀,推荐用EXISTS子查询代替内连接:
select Timestamp, Campaign, Media, sv3, sv4 from media where exists ( select 1 from media_1 where media.sv3=media_1.sv3 and media.sv4=media_1.sv4 );
这个查询只会返回media表中满足条件的行,最多就是6000行,不会产生笛卡尔积。
内容的提问来源于stack exchange,提问作者lal
相关产品推荐
相关产品推荐

