SQL查询行条目全部重复,是否需要调整JOIN关联逻辑?
SQL重复行问题修复方案
你遇到的查询结果全量重复问题确实和JOIN关联逻辑直接相关,核心是关联表存在一对多映射关系产生了笛卡尔积,具体排查和修复方法如下:
问题原因
单条disp_ship运单记录会关联多条disp_events运单事件、多条disp_items货品明细,两个一对多关联叠加后就会产生乘法效应的重复行,比如1条运单对应2条事件、3条货品,最终就会返回6条重复的基础运单数据。
修复方案
可根据你的业务需求任选以下方案:
- 快速去重:不需要调整关联逻辑,直接在SELECT开头加
DISTINCT即可,修改为:SELECT DISTINCT ds_id as "TMP", ds_ship_date as "Ship Date", -- 其余字段保持和原查询一致即可 - 调整关联逻辑根治重复:
- 如果你关联
disp_events仅为了满足de_site = ds_findest_id的筛选条件,不需要取事件表的字段,直接把disp_events的JOIN改成EXISTS子查询即可,避免拉取多条事件产生重复:FROM dba.disp_ship JOIN dba.disp_items ON DBA.disp_items.di_shipment_id = dba.disp_ship.ds_id JOIN dba.companies o ON o.co_id = ds_origin_id WHERE EXISTS (SELECT 1 FROM dba.disp_events WHERE de_shipment_id = ds_id AND de_site = ds_findest_id) AND ds_id = '70189' ORDER BY ratecodename desc - 如果你需要保留事件表的字段,可先对
disp_events按运单ID做聚合,保证单条运单仅对应一条事件记录后再做关联,避免一对多叠加产生重复。
- 如果你关联
额外优化建议
你当前WHERE条件中用了别名TMP = '70189'做筛选,部分数据库不支持SELECT里定义的别名直接用于WHERE筛选,建议修改为原始字段名ds_id = '70189'兼容性更好。
内容的提问来源于stack exchange,提问作者Bertocious
相关产品推荐
相关产品推荐

