如何筛选仅含05_A仓储类型、不含05_B的artid数据?
筛选存在05_A但无05_B的商品ID的SQL实现
错误语句分析
- 第一个语句逻辑矛盾:同一行记录的
warehousetype不可能同时满足like '05_A'和not like '05_A',因此返回结果为空。 - MINUS语句若未精准限定范围,可能会返回所有不包含05_B的记录(包括从未有过05_A的商品),不符合“必须存在05_A”的要求。
正确实现方案
方案1:GROUP BY + HAVING(推荐,适合统计场景)
通过分组统计每个商品的特性存在情况,筛选出符合条件的商品ID:
SELECT artid FROM your_table_name GROUP BY artid HAVING COUNT(CASE WHEN warehousetype = '05_A' THEN 1 END) > 0 AND COUNT(CASE WHEN warehousetype = '05_B' THEN 1 END) = 0;
或用SUM写法:
SELECT artid FROM your_table_name GROUP BY artid HAVING SUM(CASE WHEN warehousetype = '05_A' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN warehousetype = '05_B' THEN 1 ELSE 0 END) = 0;
方案2:NOT EXISTS子查询(逻辑直观)
先筛选出有05_A的商品,再排除其中存在05_B的商品:
SELECT DISTINCT artid FROM your_table_name t1 WHERE t1.warehousetype = '05_A' AND NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.artid = t1.artid AND t2.warehousetype = '05_B' );
方案3:LEFT JOIN + IS NULL(关联查询方式)
通过左连接匹配05_B的记录,筛选出匹配失败(即无05_B)且本身有05_A的商品:
SELECT DISTINCT t1.artid FROM your_table_name t1 LEFT JOIN your_table_name t2 ON t1.artid = t2.artid AND t2.warehousetype = '05_B' WHERE t1.warehousetype = '05_A' AND t2.artid IS NULL;
内容的提问来源于stack exchange,提问作者Mik
相关产品推荐
相关产品推荐

