Oracle SQL多列条件查询问题:筛选符合特定成绩规则的记录
Oracle SQL 查询条件修正方案
问题根源
你的原查询错误地使用了AND连接两个条件,导致只筛选出同时满足两科都不是A、且两科都不是F的行,这就把Austin这类「一科是A、另一科不是」的合法数据排除了,不符合需求。
根据需求,我们需要排除的只有两种极端情况:
- 历史和数学成绩都是'A'
- 历史和数学成绩都是'F'
其余所有行(包括一科是A/F、另一科不是的,以及两科都不是A/F的)都需要保留。
正确查询语句
方案一:调整逻辑运算符(替换AND为OR)
把原条件中的AND改成OR,只要满足「两科都不是A」或者「两科都不是F」就会被选中,完全覆盖需求:
select * from scores where (history_grade <> 'A' and math_grade <> 'A') OR (history_grade <> 'F' and math_grade <> 'F' )
方案二:反向排除(更直观)
直接排除掉不符合要求的两种情况,剩下的就是目标结果:
select * from scores where not ( (history_grade = 'A' and math_grade = 'A') OR (history_grade = 'F' and math_grade = 'F') )
验证结果
执行上述任意语句后,返回的结果集如下:
| name | history_grade | math_grade |
|---|---|---|
| Mary | C | B |
| Austin | C | A |
| Kyle | B | B |
完全符合你需要的结果,排除了Bill(双A)和Sue(双F)。
内容的提问来源于stack exchange,提问作者John k.
相关产品推荐
相关产品推荐

