SQL 查询优化:解决 LEFT JOIN 导致数据错乱的问题

以下 SQL 查询语句可能会导致数据错乱,因为在 LEFT JOIN 条件中使用了 'b.product_skc_id = a.product_skc_id',这会导致同一个 assessment_id 对应的多个 qc_bill 记录都会被匹配到,并且被分组统计。

SELECT max(b.qc_end_time) qc_end_time ,a.mian_reason,a.product_skc_id FROM erp_pdd_stock_assessment a 
LEFT JOIN erp_pdd_qc_bill b ON a.id = b.assessment_id and b.product_skc_id = a.product_skc_id
GROUP BY a.main_reason,a.product_skc_id

解决方法:

将 LEFT JOIN 条件中的 'b.product_skc_id = a.product_skc_id' 移动到 WHERE 子句中,同时添加一个子查询来获取每个 assessment_id 对应的最大 qc_end_time。

SELECT max(b.qc_end_time) qc_end_time, a.main_reason, a.product_skc_id 
FROM erp_pdd_stock_assessment a 
LEFT JOIN (
    SELECT assessment_id, product_skc_id, max(qc_end_time) as qc_end_time 
    FROM erp_pdd_qc_bill 
    GROUP BY assessment_id, product_skc_id
) b ON a.id = b.assessment_id 
WHERE b.product_skc_id = a.product_skc_id
GROUP BY a.main_reason, a.product_skc_id

这样就可以确保每个 assessment_id 只会匹配到对应的最大 qc_end_time 了。

总结:

在使用 LEFT JOIN 时,需要注意避免将多个条件都放在 JOIN 条件中,特别是当存在可能导致重复匹配的条件时。通过将重复匹配的条件移动到 WHERE 子句,并使用子查询获取唯一值,可以有效避免数据错乱问题。


原文地址: https://www.cveoy.top/t/topic/p9cw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录