为何微软Lab子查询方案正确,我的INNER JOIN查询结果重复?
为什么IN子查询返回唯一产品,而INNER JOIN返回重复记录?
微软方案正确的原因
微软的IN子查询逻辑是:
- 先从销售明细表中筛选出所有曾以UnitPrice<100售出的ProductID(即使同一个ProductID在子查询结果中出现多次,
IN运算符会自动去重,只保留唯一值) - 再在产品表中匹配这些ProductID,同时筛选出ListPrice≥100的产品
最终返回的是符合条件的唯一产品记录,完全匹配任务“检索符合条件的产品”的要求。
你的JOIN查询存在的问题
你的INNER JOIN是将产品表与销售明细表做关联,每一条符合条件的销售记录都会对应生成一条产品记录。比如某产品有3次单价低于100的销售,就会返回3条该产品的结果,因此最终得到27条包含重复产品的记录——这是因为你没有对关联后的结果做去重处理,不符合任务要求的“唯一产品”目标。
修正后的JOIN写法
要得到和微软子查询一致的唯一产品结果,只需在查询中添加去重逻辑,两种常用方式:
方式1:使用DISTINCT
SELECT DISTINCT p.ProductID, p.Name, p.ListPrice FROM SalesLT.Product p JOIN SalesLT.SalesOrderDetail s ON p.ProductID = s.ProductID WHERE p.ListPrice >= 100.00 AND s.UnitPrice < 100.00 ORDER BY ProductID;
方式2:使用GROUP BY
SELECT p.ProductID, p.Name, p.ListPrice FROM SalesLT.Product p JOIN SalesLT.SalesOrderDetail s ON p.ProductID = s.ProductID WHERE p.ListPrice >= 100.00 AND s.UnitPrice < 100.00 GROUP BY p.ProductID, p.Name, p.ListPrice ORDER BY ProductID;
以上两种写法都会返回7条唯一的产品记录,与微软的子查询结果一致。
内容的提问来源于stack exchange,提问作者nam
相关产品推荐
相关产品推荐

