如何从stats表中查询仅向单一卖家采购零件的项目id_proj
问题分析
你原有SQL的逻辑和需求完全不匹配:你写的语句是筛选采购的所有零件都不属于卖家S5售卖范围的项目,而需求是筛选采购的所有零件都只有唯一供应商的项目,没有限定供应商为固定的S5。
正确SQL实现
实现逻辑
- 先统计每个零件的不同供应商数量,筛选出存在多个供应商的零件集合
- 排除所有采购过上述多供应商零件的项目,剩余的就是所有采购零件都只有唯一供应商的项目
SELECT DISTINCT id_proj FROM stats WHERE id_proj NOT IN ( -- 找出所有采购过多供应商零件的项目 SELECT DISTINCT s.id_proj FROM stats s INNER JOIN ( -- 找出所有有多个供应商的零件 SELECT id_part FROM stats GROUP BY id_part HAVING COUNT(DISTINCT id_seller) > 1 ) multi_seller_parts ON s.id_part = multi_seller_parts.id_part );
如果你使用的数据库支持CTE语法,也可以用可读性更好的写法:
WITH multi_seller_parts AS ( SELECT id_part FROM stats GROUP BY id_part HAVING COUNT(DISTINCT id_seller) > 1 ), invalid_proj AS ( SELECT DISTINCT id_proj FROM stats s INNER JOIN multi_seller_parts msp ON s.id_part = msp.id_part ) SELECT DISTINCT id_proj FROM stats WHERE id_proj NOT IN (SELECT id_proj FROM invalid_proj);
内容的提问来源于stack exchange,提问作者CherrJ
相关产品推荐
相关产品推荐

