如何编写SQL查询从两个表中筛选符合条件且缺失红色颜色值的记录
正确SQL实现
你原有第一条查询存在逻辑优先级问题:AND 运算优先级高于 OR,原有写法会匹配到「状态为active的Apple」或者「任意状态的Strawberry」,不符合你的筛选要求,调整后可以用以下两种方案实现需求:
方案1:LEFT JOIN 空值匹配(逻辑直观)
SELECT f.code, f.fruit, 'red' AS missingColor FROM fruit f LEFT JOIN color c ON f.code = c.code AND c.color = 'red' WHERE f.status = 'active' AND f.fruit IN ('Apple', 'Strawberry') AND c.code IS NULL;
逻辑说明:
- 先从fruit表过滤出符合状态、水果类型要求的记录
- 左关联color表时直接限定仅匹配颜色为red的记录,若对应code没有red色值,关联出来的color表字段全部为空
- 最后过滤出关联结果为空的记录就是符合要求的无效记录
方案2:NOT EXISTS 子查询(大表性能更优)
SELECT f.code, f.fruit, 'red' AS missingColor FROM fruit f WHERE f.status = 'active' AND f.fruit IN ('Apple', 'Strawberry') AND NOT EXISTS ( SELECT 1 FROM color c WHERE c.code = f.code AND c.color = 'red' );
逻辑说明:
- 先过滤fruit表的符合条件的记录
- 子查询判断对应code在color表中是否存在red色值,不存在就返回当前记录
两种方案返回的结果都和你要求的输出一致,无需额外加GROUP BY或者DISTINCT即可满足需求。
内容的提问来源于stack exchange,提问作者p4rt2020
相关产品推荐
相关产品推荐

