数据库查询需求:基于WHERE条件排除行,筛选不含鸡蛋的食谱
嘿,我懂你碰到的麻烦了——你的recipe表是每行对应一种食材,直接用WHERE IngredientName != '鸡蛋'肯定得不到正确结果,毕竟有鸡蛋的食谱里还有其他食材行,这样查询还是会把那个食谱的非鸡蛋食材行捞出来,导致它依然出现在结果里。
正确的查询方案
要找出完全不含鸡蛋的食谱,核心逻辑是:排除所有至少包含一次鸡蛋的食谱,剩下的就是我们要的。下面给你两种靠谱的实现方式:
方式1:用NOT EXISTS子查询(最直观)
这个方法的思路是:对每个食谱,检查它有没有鸡蛋的食材记录,如果没有,就保留这个食谱名:
SELECT DISTINCT Recipename FROM recipe r_main WHERE NOT EXISTS ( SELECT 1 FROM recipe r_sub WHERE r_sub.Recipename = r_main.Recipename AND r_sub.IngredientName = '鸡蛋' );
这里的DISTINCT是为了去重——毕竟一个食谱对应多行食材记录,我们只需要唯一的食谱名。
方式2:用GROUP BY+HAVING统计过滤
通过分组统计每个食谱的鸡蛋出现次数,过滤掉次数大于0的食谱:
SELECT Recipename FROM recipe GROUP BY Recipename HAVING SUM(CASE WHEN IngredientName = '鸡蛋' THEN 1 ELSE 0 END) = 0;
解释一下:分组后,CASE语句会把鸡蛋食材标记为1,其他为0,求和后如果等于0,说明这个食谱完全没用到鸡蛋,符合我们的要求。
为啥你之前的查询不对?
估计你之前写的是类似这样的语句:
SELECT DISTINCT Recipename FROM recipe WHERE IngredientName != '鸡蛋';
这会把两个食谱都返回,因为“Kitchen Sink Cookies”里除了鸡蛋还有16种其他食材,这些行都会被这条语句选中,所以这个食谱名依然会出现在结果里——这就是问题的根源!
内容的提问来源于stack exchange,提问作者mbcharney
相关产品推荐
相关产品推荐

