SQL多表关联优化:使用part number和GL code关联7张表的写法咨询
现有代码问题梳理
- 语法错误:SELECT 列表最后一个字段后多了多余的逗号,执行会直接报错
- 关联逻辑混乱:混合使用显式JOIN和逗号分隔的隐式关联写法,极易产生意料之外的笛卡尔积,导致数据量异常膨胀
- LEFT JOIN特性失效:把GL code的关联条件放到WHERE子句中,用OR匹配STKMM、STKMP的GL编码,会过滤掉STKMM、STKMP关联结果为NULL的part数据,相当于把LEFT JOIN变成了INNER JOIN,丢失无对应GL编码的库存数据
优化后实现方案
SELECT code.a30 AS gl_code_description, stkas.bc1part AS part_num, stkmm.avdes1 AS man_desc, stkmp.awdes1 AS pur_desc, stkas.bc1qtyh AS inventory, icstm.cgstcs AS man_std_cost, icstp.chstcs AS pur_std_cost FROM stkas -- 5张表通过part number关联 LEFT JOIN stkmm ON stkmm.avpart = stkas.bc1part LEFT JOIN stkmp ON stkmp.awpart = stkas.bc1part LEFT JOIN icstm ON icstm.cgpart = stkas.bc1part LEFT JOIN icstp ON icstp.chpart = stkas.bc1part -- GL code关联改为显式LEFT JOIN,保留所有part数据 LEFT JOIN code ON code.a9 IN (stkmm.avgled, stkmp.awgled)
优化说明
- 统一使用显式JOIN写法,所有关联条件都放到对应JOIN的ON子句中,逻辑清晰且避免隐式关联的笛卡尔积问题
- 用
IN替代OR简化GL code匹配逻辑,同时LEFT JOIN保留了没有对应GL编码的part数据,符合库存维度关联的常见需求 - 修复了语法错误,删除了SELECT列表末尾的多余逗号
- 如果业务需要仅保留有GL编码匹配的part数据,把针对CODE表的LEFT JOIN改为INNER JOIN即可
内容的提问来源于stack exchange,提问作者PaoDelSol
相关产品推荐
相关产品推荐

