SQL查询:筛选单一供应商且CanBeMailed为True的ProductID
筛选符合条件的ProductID解决方案
嘿,我懂这种卡壳的感觉!其实这个需求用SQL的分组和筛选就能轻松搞定,咱们一步步来:
你想要从下表中返回ProductID,要求满足两个条件:
CanBeMailed = True- 该ProductID仅对应一个供应商
以下是你提供的示例表格:
| ProductID | Supplier | CanBeMailed |
|---|---|---|
| 1 | A | False |
| 1 | B | True |
| 2 | C | True |
| 3 | C | False |
| 4 | D | False |
| 4 | E | False |
| 5 | E | True |
| 6 | F | ... |
按照你的要求,最终应该返回ProductID 2和5,而排除ProductID 1(因为它对应两个供应商)。
解决方案一:直接筛选+分组验证
这是最简洁的写法,先过滤出CanBeMailed = True的记录,再按ProductID分组,验证每个分组的供应商数量是否为1:
SELECT ProductID FROM YourTableName WHERE CanBeMailed = True GROUP BY ProductID HAVING COUNT(DISTINCT Supplier) = 1;
WHERE CanBeMailed = True:先把符合邮寄条件的记录挑出来GROUP BY ProductID:按产品ID分组HAVING COUNT(DISTINCT Supplier) = 1:确保每个分组里的不同供应商数量只有1个,也就是该产品只对应一个供应商
解决方案二:先统计供应商数量再关联筛选
如果需要更清晰的逻辑拆分,可以先统计每个ProductID对应的供应商总数,再和原表关联筛选:
SELECT p.ProductID FROM ( -- 先统计每个产品的供应商总数 SELECT ProductID, COUNT(DISTINCT Supplier) AS SupplierCount FROM YourTableName GROUP BY ProductID ) AS p -- 关联原表找到符合邮寄条件的记录 JOIN YourTableName t ON p.ProductID = t.ProductID WHERE t.CanBeMailed = True AND p.SupplierCount = 1;
这种写法的好处是可以单独查看每个产品的供应商数量,方便后续扩展其他筛选条件。
注意:记得把代码里的YourTableName替换成你实际使用的表名哦!
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

