SQL 查询语句优化:修复导致数据错乱的 GROUP BY 和 LEFT JOIN 问题
SELECT max( a.operational_progress ) operational_progress, a.operational_remark, a.product_skc_id, a.main_reason \nFROM erp_pdd_stock_assessment a\nLEFT JOIN ( SELECT product_skc_id, main_reason, max( operational_progress ) AS operational_progress, operational_remark FROM erp_pdd_stock_assessment GROUP BY main_reason, product_skc_id ) b ON a.product_skc_id = b.product_skc_id and a.main_reason = b.main_reason and a.operational_progress = b.operational_progress and a.operational_remark = b.operational_remark\nGROUP BY a.main_reason, a.product_skc_id会导致数据错乱吗,错乱了如何修改内容:根据给出的SQL查询语句,以下是可能导致数据错乱的问题:\n\n1. 在子查询中,使用了GROUP BY子句来分组结果。这意味着对于每个不同的main_reason和product_skc_id组合,只能选择一个operational_progress和operational_remark的值。这可能导致丢失其他可能的operational_progress和operational_remark的组合。\n\n2. 在主查询中,使用了LEFT JOIN来连接原始表和子查询结果。这意味着对于每个原始表的记录,将选择与子查询结果匹配的记录。如果在子查询中找不到匹配的记录,那么将返回NULL值。这可能导致一些原始表的记录被丢弃。\n\n要修复此问题,可以尝试以下修改:\n\n1. 移除子查询中的GROUP BY子句。这样可以选择每个main_reason和product_skc_id组合的所有可能的operational_progress和operational_remark的值。\n\n2. 在主查询中使用INNER JOIN而不是LEFT JOIN。这样,只有在子查询中找到与原始表记录匹配的记录时,才会返回结果。\n\n修复后的SQL查询语句如下所示:\n\nSELECT max(a.operational_progress) operational_progress, a.operational_remark, a.product_skc_id, a.main_reason \nFROM erp_pdd_stock_assessment a\nINNER JOIN (SELECT product_skc_id, main_reason, operational_progress, operational_remark FROM erp_pdd_stock_assessment) b \n ON a.product_skc_id = b.product_skc_id \n AND a.main_reason = b.main_reason \n AND a.operational_progress = b.operational_progress \n AND a.operational_remark = b.operational_remark\nGROUP BY a.main_reason, a.product_skc_id
原文地址: https://www.cveoy.top/t/topic/p9d9 著作权归作者所有。请勿转载和采集!