如何将含SELECT子查询的产品采购量统计SQL转换为JOIN查询
转换关联子查询为JOIN查询优化性能
优化后的JOIN写法
直接通过INNER JOIN关联两张表,避免逐行子查询的性能损耗:
SELECT p.ProductName AS 'Product Name', SUM(o.quantity) AS 'Total Quantity' FROM OrderItem o INNER JOIN Product p ON o.Productid = p.id GROUP BY p.id, p.ProductName ORDER BY SUM(o.quantity) DESC
关键说明
- 关联逻辑:通过
OrderItem.Productid和Product.id建立关联,一次性完成两张表的匹配,替代原查询中每一行都执行一次子查询的低效方式。 - 分组规则:
GROUP BY同时包含p.id和p.ProductName——因为id是Product表的主键(唯一标识产品),即使存在产品名称重复的情况,也能保证分组的准确性;如果你的业务中ProductName是唯一的,也可以只按p.ProductName分组,但按主键分组更稳妥。 - 排序注意:部分数据库对
ORDER BY中使用别名的支持有限,直接用SUM(o.quantity)排序兼容性更好,当然如果你的数据库支持(比如MySQL),也可以直接写ORDER BY 'Total Quantity' DESC。
扩展:包含未被采购的产品
如果需要统计所有产品的采购数量(包括从未被采购过的,总数量显示0),可以改用LEFT JOIN并配合COALESCE处理空值:
SELECT p.ProductName AS 'Product Name', COALESCE(SUM(o.quantity), 0) AS 'Total Quantity' FROM Product p LEFT JOIN OrderItem o ON p.id = o.Productid GROUP BY p.id, p.ProductName ORDER BY COALESCE(SUM(o.quantity), 0) DESC
内容的提问来源于stack exchange,提问作者Asad Hussain
相关产品推荐
相关产品推荐

