多次关联同一张表导致查询记录翻倍,表现类似交叉连接,请求协助排查
查询结果行数翻倍问题排查
根本触发原因
- 结果数恰好是预期值2倍、表现类似交叉连接,本质是关联环节触发了一对多匹配:
secondry_details映射表中存在重复的city_name值,导致主表单条记录匹配到多条映射记录后被拆分成多行。 - 实际触发场景可以具象为:如果映射表里同一个城市名称(例如"深圳")对应了2条不同的城市编码记录,那么主表里所有出发/到达城市是"深圳"的航段记录,关联后都会生成2行结果,累计下来总记录数刚好达到预期值的2倍,和交叉连接的表现高度相似。
- 原SQL存在表名笔误:将映射表写为
secondry_details1,如果实际查询时关联的是存在冗余重复数据的表副本,也会进一步放大匹配后的行数。
排查与修正操作步骤
- 第一步先定位映射表的重复数据,执行以下SQL直接筛出所有存在重复映射的城市:
select city_name, count(*) as record_cnt from secondry_details group by city_name having count(*) > 1
该SQL返回的所有城市,就是导致行数翻倍的核心来源。
- 第二步优化关联逻辑,在关联前先对映射表做去重处理,保证每个城市名称只对应唯一的城市编码,从根源上避免一对多拆分行。参考修正后的SQL写法:
select m.Departure_city, s1.City_code as departure_city_code, m.Arrival_city, s2.City_code as arrival_city_code from master m left join ( -- 预去重,确保每个city_name只保留唯一映射记录 select distinct city_name, city_code from secondry_details ) s1 on m.Departure_city = s1.city_name left join ( select distinct city_name, city_code from secondry_details ) s2 on m.Arrival_city = s2.city_name
- 额外注意:原SQL中
s2.Arrival_city_code属于错误字段引用,映射表中不存在该字段,实际应该引用s2.City_code做到达城市编码的别名。这个笔误和当前行数翻倍的问题无关,但会在后续执行时触发字段不存在的报错。
内容的提问来源于stack exchange,提问作者Mohammed shariq
相关产品推荐
相关产品推荐

