MS Access中多表关联如何避免UNION ALL导致的数据重复问题
SQL查询优化方案
你可以通过单次左连接两个规则表的方式实现需求,完全避免UNION ALL带来的重复数据问题和重复扫描q_Step2_AMR的性能损耗,优化后的语句如下:
SELECT q_Step2_AMR.[Location Code], q_Step2_AMR.[Database Code], q_Step2_AMR.[HS Boat Code], q_Step2_AMR.[HS Boat Length 2], q_Step2_AMR.[Database Code] & q_Step2_AMR.[HS Boat Code] AS [Unique Vessel ID By DB], t_BLG.[Boat Length Group], t_MEGA.[Mega Attribute Length] FROM q_Step2_AMR LEFT JOIN t_BLG ON q_Step2_AMR.[Location Code] = t_BLG.[Location Code] AND q_Step2_AMR.[HS Boat Length 2] BETWEEN t_BLG.[Min Boat Length] AND t_BLG.[Max Boat Length] LEFT JOIN t_MEGA ON q_Step2_AMR.[Database Code] = t_MEGA.[Database Code] AND q_Step2_AMR.[HS Boat Length 2] BETWEEN t_MEGA.[Min Boat Length] AND t_MEGA.[Max Boat Length]
方案说明
- 将长度区间匹配条件从WHERE子句移到JOIN的ON子句中,保证左连接逻辑不会被过滤失效,未匹配到规则的记录对应字段返回NULL
- 仅单次读取q_Step2_AMR表,执行效率远高于UNION ALL写法,且不会生成重复行
- 输出结构和你给出的预期结果完全一致,不需要额外做数据清洗
内容的提问来源于stack exchange,提问作者Graysem
相关产品推荐
相关产品推荐

